寄生组合式继承的执行流程是:先通过parent.call(this)为子类实例初始化独立属性,再用object.create(parent.prototype)干净连接父类原型方法,最后修复constructor指向child。

寄生组合式继承的执行流程很清晰:先让子类实例拥有独立的属性(靠 call),再让子类原型干净地连接父类方法(靠 Object.create),不触发父构造函数,也不污染父原型。
第一步:定义父类(含实例属性和原型方法)
父类负责封装可复用的行为和默认状态。实例属性写在构造函数里,方法挂到 prototype 上。
- 实例属性(如
this.name、this.colors)会在每次 new 时生成新副本 - 原型方法(如
sayName)所有实例共享,节省内存
第二步:子类构造函数内调用 Parent.call(this, ...)
这一步把父类的实例初始化逻辑“借”过来,确保每个子类实例都有自己的一份属性,尤其是引用类型(比如数组、对象)不会被多个实例意外共享。
- 支持向父类传参,比如
Parent.call(this, name) - 避免了原型链继承中无法传参的问题
- 不会影响原型链,只处理当前实例的属性
第三步:用 Object.create(Parent.prototype) 设置子类原型
这是“寄生”的核心——创建一个干净的中间对象,它的 __proto__ 指向 Parent.prototype,但不执行 Parent 构造函数。
- 相比
new Parent(),它跳过了父构造函数的执行,避免重复初始化(比如打印日志、修改全局状态等) - 子类原型获得全部父类原型方法,且与父类原型完全解耦
- 后续对
Child.prototype的修改,不会波及Parent.prototype
第四步:修复 constructor 指向
因为 Object.create(...) 创建的对象,其 constructor 默认指向 Parent,必须手动改回 Child。
- 写法固定:
Child.prototype.constructor = Child - 否则
new Child() instanceof Child虽为 true,但instance.constructor会返回Parent,影响调试和类型识别 - 如果后续要扩展子类方法,也建议在这之后添加,保持结构一致











