segmentfault官方|ES5 继承( 四 )


由图可见s的原型链上依然有name跟colors属性 。 这也是不需要的 。 怎么解决这两个问题?
父类的属性是需要的 , 父类的原型上的方法是需要的 , 重复的父类属性不需要 , 由上图可见重复的父类属性是由于实例化父类给子类原型造成的 , 我们不去实例化父类 , 而是将父类的原型传递给子类的原型就行了 , 结合原型式继承特点可以做到
functionSuperType(name) {
this.name = name;
this.colors = [ "red", "blue", "green"];
}
SuperType.prototype.sayName = function{
console.log(this.name);
};
functionSubType(name, age) {
SuperType.call(this, name); // 将父类的属性绑定到SubType实例中
this.age = age;
}
SubType.prototype = Object.create(SuperType.prototype);
// 将子类的prototype关联到父类的prototype上
SubType.prototype.sayAge = function{
console.log(this.age);
};
使用Object.create解决了父类构造函数调用两次 , 父类属性重复的问题 , 但是子类constructor并没有出现在原型链中
segmentfault官方|ES5 继承
本文插图

下面做出改造:
SubType.prototype = Object.create(SuperType.prototype, {
constructor: {
value: SubType, // 修正 constructor 指向
writable: true,
configurable: true,
},
});
segmentfault官方|ES5 继承
本文插图

SuperType的constructor出现了 , 其实constructor并没什么用 , 只是个约定罢了,参考贺老的解释Java 中对象的 constructor 属性的作用是什么?(https://www.zhihu.com/question/19951896/answer/13457869)
instanceof操作符和 isPrototypeOf 方法正常有效 。 寄生式组合继承可以
算是引用类型继承的最佳模式


推荐阅读