寄生组合式继承的核心目标是只调用一次父类构造函数,使子类实例拥有父类实例属性并共享原型方法;通过object.create(parent.prototype)替代new parent()创建原型,避免冗余执行与副作用,确保原型链正确且constructor指向准确。

寄生组合式继承的核心目标,就是只调用一次父类构造函数,同时让子类实例既能拥有父类的实例属性(通过构造函数继承),又能共享父类的原型方法(通过原型链继承)——从而避免传统组合式继承中多次调用父类构造函数造成的冗余和性能浪费。
避免重复执行父类构造函数
传统组合式继承会在子类构造函数里调用 Parent.call(this, ...),又在设置原型时用 new Parent(),导致父类构造函数被调用两次。第一次给实例加属性,第二次只是为了取到原型对象,却无谓地新建了临时实例、执行了初始化逻辑(比如打印、发请求、改状态等),造成冗余甚至副作用。
- 寄生组合式继承改用一个空函数作为中间桥梁,切断其原型与父类实例的绑定
- 把父类的原型对象完整赋给这个空函数的
prototype - 再用
new这个空函数创建干净的原型对象,赋给子类的prototype - 这样既复用了父类原型上的方法,又不触发父类构造函数
用 Object.create 替代 new Parent() 构造原型
现代写法直接使用 Object.create(Parent.prototype),它内部不调用构造函数,仅以指定对象为原型创建新对象,语义清晰、行为可控。
- 比手动定义空函数更简洁,也更符合 ES5+ 规范
- 确保子类原型链正确指向
Parent.prototype,支持instanceof和方法查找 - 避免因父类构造函数有副作用(如初始化计数器、注册监听器)而产生意外状态
子类构造函数中精准调用父类构造逻辑
父类构造函数只在子类实例化时调用一次,用于初始化实例自有属性(如 this.name、this.age),不掺杂原型操作。
- 子类
constructor内仍用Parent.call(this, ...)传递参数 - 不依赖原型上的同名方法来“模拟”构造逻辑,避免逻辑分散
- 保持构造职责单一:实例属性归构造函数,共享方法归原型
可选:封装为可复用的 inherit 函数
把寄生组合式继承的通用步骤抽成工具函数,进一步消除模板代码。
- 统一处理
Child.prototype = Object.create(Parent.prototype) - 自动修复
constructor指向,防止子类原型丢失自身标识 - 调用时只需
inherit(Child, Parent),一行替代五六行样板











