在讲寄生组合继承之前,有必要先讲一下「组合继承」。
组合继承可以说是最常用的继承方式了。
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
寄生组合继承的实现核心是将父类的原型赋值给了子类,并且将构造函数设置为子类。
如此一来,既解决了无用的父类属性问题,还可以正确地找到子类的构造函数。