1、原型继承
function Person(){
this.name = 'Person'
}
function Child(){
this.age = 12
}
Child.prototype = new Person();
let a = new Child();
let b = new Child();
优点:共享了父类构造函数的方法
缺点:
- 不能向构造函数传参
- 子类实例共享了父类构造函数的引用属性
- 无法实现多继承
2、构造函数继承
function Person(name){
this.name = name
}
function Child(name){
Person.call(this,name)
this.age = 12
}
let a = new Child();
let b = new Child();
优点:
- 可向构造函数传参。
- 不共享父类构造函数的引用属性。
- 可以进行多次继承(call多个父类函数)
缺点:
- 无法实现函数的复用。
- 只能继承父类构造函数中的属性和方法,不能继承父类构造函数原型上的方法,
3、组合继承
function Person(name){
this.name = name
}
function Child(name){
Person.call(this,name)
this.age = 12
}
Child.prototype = new Person()
Child.prototype.constructor = Child
优点:
- 可以向父类构造函数传参。
- 可以复用构造函数原型上的方法。
- 不会共享父类的引用属性。
缺点:由于调用了两次构造函数方法,会存在一份多余的父类实例属性(耗内存)。
4、组合继承优化
function Person(name){
this.name = name
}
function Child(name){
Person.call(this,name)
this.age = 12
}
Child.prototype = Person.prototype
Child.prototype.constructor = Child
优点:
- 可以向父类构造函数传参。
- 可以复用父类原型上的方法。
缺点:当修复子类构造函数的指向后,父类实例的构造函数指向也会随之改变(这是我们不希望发生的)。
5、寄生组合继承
function Person(name){
this.name = name
}
function Child(name){
Person.call(this,name)
this.age = 12
}
Child.prototype = Object.create(Person.prototype)
Child.prototype.constructor = Child
优点:弥补组合继承优化的不足