寄生组合式继承是目前javascript最优继承方案,因其只调用一次父类构造函数、避免冗余执行与副作用,精准复用原型链且保持实例隔离与方法共享。

寄生组合式继承之所以被公认为目前 JavaScript 中最优的继承方案,核心在于它精准解决了其他继承方式长期存在的结构性缺陷——既不浪费执行、也不破坏原型链,还能兼顾实例隔离与方法复用。
只调用一次父类构造函数
这是它区别于组合继承的关键。组合继承会在两处触发父类构造函数:一次在设置子类原型时(Child.prototype = new Parent()),另一次在子类实例化时(Parent.call(this))。前者纯属冗余,可能引发副作用(比如重复初始化 DOM、触发事件、创建定时器等);而寄生组合式继承用 Object.create(Parent.prototype) 替代 new Parent(),跳过执行,仅复用原型对象。
- 避免父类逻辑被意外多次执行
- 节省内存和初始化开销
- 确保每个实例属性由子类构造函数统一、可控地初始化
完整保留原型链与 constructor 指向
子类原型干净地指向父类原型,中间无污染、无中间实例。这使得 instanceof 判定准确,方法查找路径稳定,引擎也能据此做静态优化(如 V8 的 IC 缓存和去虚拟化)。
child.__proto__ === Child.prototypeChild.prototype.__proto__ === Parent.prototype-
Child.prototype.constructor === Child(手动修复后)
真正实现属性隔离 + 方法复用
实例属性通过 Parent.call(this, ...) 绑定到每个子类实例上,互不影响;而方法全部保留在父类原型上,所有子类实例共享同一份函数引用,不重复创建。
- 引用类型属性(如数组、对象)不会被多个实例意外共享
- 支持向父类构造函数传参,灵活性高
- 父类原型方法可动态扩展,子类自动继承
天然契合现代引擎与语言演进
class + extends 的底层机制就是寄生组合式继承。引擎(如 V8、SpiderMonkey)在解析 extends 时,会提前构建确定的原型链拓扑,并为构造函数生成更优的隐藏类序列。Babel 或 TypeScript 的降级输出也默认采用该模式,并辅以 Object.setPrototypeOf 等增强兼容性。
- 写
class Child extends Parent就等于启用最优继承语义 - 无需手动维护
constructor修复或call调用,语法更安全简洁 - 在严格模式或冻结原型下,JIT 编译器可直接内联父类方法调用











