寄生组合继承的核心是用Object.create(Parent.prototype)创建子类原型以干净继承父类原型结构,再手动修复constructor指向Child,子类构造函数中仅调用一次Parent.call(this)初始化实例属性。

寄生组合继承中原型链指向的关键原则
寄生组合继承要维持正确的原型链,核心不是“让子类原型等于父类实例”,而是“让子类原型干净地继承父类原型的结构”。这避免了父类构造函数在设置原型时被意外执行,也防止实例属性污染原型。
必须用 Object.create(Parent.prototype) 创建子类原型
不能写 Child.prototype = new Parent()(这是原型链继承的写法),也不能写 Child.prototype = Parent.prototype(会共用 constructor 和方法,破坏隔离)。正确做法是:
- 调用
Object.create(Parent.prototype)创建一个新对象,它内部[[Prototype]]指向Parent.prototype,但自身不带任何实例属性 - 这个新对象就是子类未来所有实例的原型基础,天然构成
child → Child.prototype → Parent.prototype → Object.prototype → null链路
手动修复 constructor 指向
因为 Object.create() 创建的对象其 constructor 仍指向 Parent,必须显式重置:
Child.prototype.constructor = Child- 否则
new Child()实例的constructor会错误显示为Parent,影响类型判断和调试 - 注意:修复必须在赋值
Child.prototype后立即进行,顺序不能颠倒
子类构造函数里只调用一次 Parent.call(this)
原型链的指向已经由 Object.create 建立完成,构造函数调用仅用于初始化实例属性:
立即学习“Java免费学习笔记(深入)”;
function Child(name, age) { Parent.call(this, name); this.age = age; }- 这里调用
Parent.call是唯一一次,确保每个实例拥有独立的name、colors等属性 - 绝不在此处或别处再通过
new Parent()或类似方式触发父类构造逻辑


















