实现继承的方式有:
1、原型链继承
function Aminal (name, age) {
this.name = name
this.age = age
}
Aminal.prototype.say = function () {
console.log('我是' + this.name + ',现在' + this.age + '岁')
}
let cat = new Animal('cat', 9)
cat.say() // 我是cat,现在9岁
这就是原型链继承,通过在构造函数的原型对象上添加方法。我们知道,对象获取属性,会先从对象本身查找,如果找不到就会去其原型对象prototype上寻找,这就是原型链。实例继承会继承自构造函数的属性。
2、class的extends继承
class类相当于是一种新的构造函数,他提供了extends字段来实现继承。
class Animal {
constructor(name, age) {
this.name = name
this.age = name
}
say () {
console.log(this.name + this.age)
}
}
class Cat extends Animal {
constructor(name, age,color) {
super(color)
this.color = color
}
}
let cat = new Cat('cat', 3, 'blue')
cat.say() //cat3
cat.clor // blue
我们来看看super关键字的作用:super即可以当作函数调用,也可以当作是对象来调用。
(1)super当作函数调用
super当作函数来调用的时候,会被当作父类的构造函数,用来新建父类的this对象提供给子类使用。所以在子类的constructor中必须要调用一次super,而且只能在子类的constructor中调用,其他地方调用会报错。
super虽然代表了父类的构造函数。但是返回的是子类的实例。super内部的this指向的是子类。就相当于是Animal.prototype.constructor.call(this)
(2)super当作对象调用
super当作普通对象被调用的时候,指向父类的原型对象,在静态方法中调用时,指向父类。