寄生组合式继承是最优继承方案:只调用一次父类构造函数、原型链完整、实例属性隔离、方法共享高效,且天然适配现代引擎优化与es6 class语义。

因为它在不牺牲功能的前提下,把继承的结构性问题全解干净了——只执行一次父类构造函数、原型链完整、实例属性隔离、方法共享高效,还天然适配现代引擎优化。
只调用一次父类构造函数,避免副作用
组合继承会调用父类构造函数两次:一次在设置子类原型时(new Parent()),另一次在子类实例化时(Parent.call(this))。前者纯属冗余,可能触发 DOM 初始化、定时器、网络请求等意外行为。寄生组合式继承用 Object.create(Parent.prototype) 替代 new Parent(),跳过执行,仅复用原型对象。
- 节省初始化开销和内存
- 确保每个实例属性由子类构造函数统一、可控地初始化
- 引用类型(如数组、对象)不会因原型污染而被多个实例意外共享
原型链干净完整,instanceof 和方法查找都可靠
子类原型直接指向 Parent.prototype,中间没有多余的实例层。这使得:
- child instanceof Parent 返回 true,判定准确
- 方法查找路径稳定,不绕路、不中断
- V8 等引擎可据此生成隐藏类、做 IC 缓存与去虚拟化优化
- 手动修复 constructor 后,Child.prototype.constructor === Child
真正实现“属性私有 + 方法共享”统一
实例属性靠 Parent.call(this, ...) 绑定到每个子类实例上,彼此独立;方法全部保留在 Parent.prototype 上,所有子类实例共享同一份函数引用。
- 支持向父类构造函数传参,灵活性高
- 父类原型方法可动态扩展,子类自动继承
- 冻结原型或启用严格模式时,JIT 编译器能内联父类方法调用
与现代语言特性深度对齐
class Child extends Parent 的底层机制就是寄生组合式继承。Babel、TypeScript 默认降级输出也采用该模式,并辅以 Object.setPrototypeOf 增强兼容性。它不是某种“手写技巧”,而是引擎认可、工具链默认、语言演进锚定的标准范式。
- 写 extends 就等于启用最优语义
- 无需手动维护 constructor 修复或 call 调用,语法更安全简洁
- 是当前唯一同时满足正确性、性能、可维护性、兼容性的方案











