js中的几种继承方式

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

优点:弥补组合继承优化的不足

猜你喜欢

转载自blog.csdn.net/qq_45503196/article/details/121131166