寄生组合式继承是最成熟的javascript继承方案,它通过空函数桥接避免引用属性共享、仅调用一次父类构造函数、修正constructor指向并确保instanceof可靠,且是es6 class的底层实现。

寄生组合式继承被公认为 JavaScript 中最成熟的继承方案,不是因为它“最炫”,而是它精准击中了其他继承方式的全部硬伤,并用极简逻辑一次性解决。
避开引用属性共享问题
原型链继承(Child.prototype = new Parent())会让所有子类实例共享父类构造函数里定义的引用类型属性,比如 this.friends = [] 或 this.config = {}。一个实例修改数组,另一个也跟着变——这是隐性 bug 的高发区。
寄生组合式继承不把父类实例直接赋给子类原型,而是用一个空函数作桥接:
- 先让空函数
F.prototype = Parent.prototype - 再让
Child.prototype = new F()
这样子类原型只继承父类原型上的方法和只读属性,完全绕开父类构造函数执行,也就彻底切断了引用属性的共享链。
父类构造函数只调用一次
组合继承的问题很典型:父类构造函数被调用了两次——一次在设置 Child.prototype = new Parent() 时,另一次在子类构造函数里写 Parent.call(this)。前者纯属冗余,还可能触发副作用(比如初始化 DOM、发起请求、生成随机 ID)。
寄生组合式继承删掉了前者,只保留子类实例化时的那一次 Parent.call(this):
- 每个子类实例拥有独立的
this.name、this.colors等实例属性 - 没有无意义的初始化开销,逻辑干净,行为可预测
constructor 指向正确 + instanceof 可靠
用 Object.create(Parent.prototype) 虽能避免构造函数执行,但会丢失 constructor 指向,导致 child.constructor === Child 为 false;某些旧环境还不支持该 API。
寄生组合式继承通过显式修正保证语义完整:
- 创建中间函数
F,设其prototype为Parent.prototype -
Child.prototype = new F()建立原型链 - 紧接着
Child.prototype.constructor = Child
结果是:child instanceof Parent 为 true,child.constructor 指向 Child,调试、类型判断、框架兼容都稳。
它是 class 的底层真相,不是替代而是还原
ES6 的 class 和 extends 不是新发明,而是对寄生组合式继承的语法糖封装。Babel 编译后、浏览器原生实现里,你看到的就是那个空函数桥接、call 实例属性、显式修正 constructor 的完整流程。
这意味着:
- 理解它,就读懂了
class的本质,而不是当黑盒用 - 在不支持
class的环境(如部分嵌入式 JS 引擎或老系统)中,它仍是唯一健壮的手动方案 - 面试、源码阅读、框架原理(如 Vue Options API 的 extends、React 的 legacy context)都绕不开它
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











