继承
- 出现在两个构造函数之间的关系
- 当A构造函数的属性和方法被B构造函数的实例使用。则说明B继承了A的构造函数。A是B的父类、B是A的子类
一、原型继承
-
通过改变原型链的方式来达到继承
-
子类.prototype = 父类的实例
-
缺点:
- 继承下来的属性没有在自己身上(在_proto_里面,访问时需要到_proto_里找)
- 创建子类实例实例时无法向父类的构造函数传参
二、构造函数继承
-
在子类的构造函数体内,借用父类构造函数执行,并强行让父类的构造函数的this指向子类的实例
-
前提:
- call()、apply()的应用:改变函数内部this
- 将父类构造函数当成普通函数使用
-
优点:
- 继承的属性在自己身上
- 在子实例中可向父实例传参
-
缺点:
- 只能继承属性,不能继承方法
- 只能继承属性,不能继承方法
三、组合继承
原型继承 + 构造函数继承
借用构造函数继承属性(还可以传参)
利用原型继承,继承父类的prototype
优点:
- 可以以继承父类原型上的属性,可以传参,可复用
缺点: - 子类原型上本来的方法没有了,必须要继承后再添加
- 调用了两次父类构造函数(耗内存)
四、 ES6继承语法
类 class
- class 可以理解为function,由于class本质还是一个function,因此它也会拥有一个的prototype属性,当new一个class时,会把class的porototype属性赋值给这个新对象的 __proto属性。
constructor
- constructor 方法是默认添加的方法,在new一个对象时,自动调用该方法,constructor里面定义自己的属性。
继承extends和super,class 子类名 extends 父类名实现继承,当然还得在constructor里面写上super(父类的参数),意思就是在子类中获得父类的this指针,相当于Animal.call(this)
// es6继承
class Animal {
//构造函数,里面写上对象的属性
constructor(props) {
this.name = props.name || 'Unknown';
}
//方法写在后面
eat() {//父类共有的方法
console.log(this.name + " will eat pests.");
}
}
//class继承
class Bird extends Animal {
//构造函数
constructor(props,myAttribute) {//props是继承过来的属性,myAttribute是自己的属性
//调用实现父类的构造函数
super(props)//相当于获得父类的this指向
this.type = props.type || "Unknown";//父类的属性,也可写在父类中
this.attr = myAttribute;//自己的私有属性
}
fly() {//自己私有的方法
console.log(this.name + " are friendly to people.");
}
myattr() {//自己私有的方法
console.log(this.type+'---'+this.attr);
}
}
//通过new实例化
var myBird = new Bird({
name: '小燕子',
type: 'Egg animal'//卵生动物
},'Bird class')
myBird.eat()
myBird.fly()
myBird.myattr()