JavaScript寄生式组合继承

“寄生式组合继承”可以算是引用类型继承的最佳模式,在“组合继承”的基础上进一步优化。

JS中,一个类即一个构造函数。

组合继承

父类

1
2
3
4
5
function Father(){
// 类属性
}
// 类方法
Father.prototype.xxx = function(){}

子类

1
2
3
4
5
6
7
8
function Sub(){
// 调用父类构造函数,继承父类属性
Father.call(this);
}
// 调用父类构造函数,指定原型,继承父类方法
Sub.prototype = new Father();
// 指定子类的原型为自己,原型与构造函数双向绑定
Sub.prototype.constructor = Sub;

寄生式组合继承

相对于组合继承,优化的一点是 Sub.prototype = new Father();,不通过new创建原型,而是通过Object.create()创建原型。

Object.create()创建的对象没有构造函数的属性,只有原型。

1
2
3
4
5
6
7
8
9
10
// 子类构造
function Sub(){
// 调用父类构造函数,继承父类属性
Father.call(this);
}
// 克隆父类原型
const proto = Object.create(Father.prototype);
// 子类构造函数和原型双向绑定,继承父类方法
Sub.prototype = proto;
proto.constructor = Sub;