js寄生组合继承

在讲寄生组合继承之前,有必要先讲一下「组合继承」。

组合继承可以说是最常用的继承方式了。

function Parent(value) {
  this.val = value
}
Parent.prototype.getValue = function() {
  console.log(this.val)
}
function Child(value) {
  Parent.call(this, value)
}
Child.prototype = new Parent()

const child = new Child(1)

child.getValue() // 1
child instanceof Parent // true

组合继承方式的核心是在子类构造函数中通过Parent.call(this)继承父类的属性,然后改变子类的原型为new Parent()来继承父类的函数。

但是组合继承的缺点是,继承父类函数时调用了父类构造函数,导致子类的原型上多了不必要的父类属性,存在内存上的浪费。

而寄生组合继承方式对组合继承进行了优化,优化掉了「组合继承继承父类函数时调用构造函数」这一缺点。

function Parent(value) {
  this.val = value
}
Parent.prototype.getValue = function() {
  console.log(this.val)
}

function Child(value) {
  Parent.call(this, value)
}
Child.prototype = Object.create(Parent.prototype, {
  constructor: {
    value: Child,
    enumerable: false,
    writable: true,
    configurable: true
  }
})

const child = new Child(1)

child.getValue() // 1
child instanceof Parent // true

寄生组合继承的实现核心是将父类的原型赋值给了子类,并且将构造函数设置为子类。

如此一来,既解决了无用的父类属性问题,还可以正确地找到子类的构造函数。

nice