寄生组合式继承是目前最成熟、推荐的javascript手动继承方式,它通过空函数桥接父类原型,避免原型共享、构造函数重复执行,并修正constructor指向;es6的class是其语法糖封装。

寄生组合式继承是目前 JavaScript 中解决传统继承缺陷最成熟、最推荐的手动实现方式。它不是简单折中,而是精准切断问题根源:既不污染原型链,也不重复执行父类构造函数,同时保证 instanceof 和 constructor 完全可靠。
避开引用属性在原型上共享
传统原型链继承(如 Child.prototype = new Parent())会让所有子类实例共享父类构造函数中创建的引用类型属性(比如 this.friends = [] 或 this.config = {})。一旦某个实例修改了这个数组或对象,其他实例立刻受影响。
寄生组合式继承完全绕开这一步——它不调用 new Parent(),而是用一个空函数桥接父类原型:
- 定义中间函数
F,设F.prototype = Parent.prototype - 再用
new F()创建一个干净对象作为子类原型 - 这样
Child.prototype只继承方法和只读属性,不携带任何父类实例数据
确保父类构造函数只执行一次
组合继承的问题在于父类构造函数被调用了两次:一次在设置 Child.prototype = new Parent() 时(无意义且可能触发副作用),另一次在子类构造函数内调用 Parent.call(this)(真正需要的那次)。
寄生组合式继承删掉了前者,只保留后者:
- 子类构造函数中仍写
Parent.call(this, ...args)—— 为每个实例独立初始化属性 - 子类原型链构建过程彻底不触发父类构造逻辑
- 避免冗余计算、DOM 初始化、网络请求等潜在副作用
保持原型链完整与 constructor 指向正确
仅用 Object.create(Parent.prototype) 虽能避免构造函数执行,但会丢失 constructor 指向,导致 child.constructor === Child 为 false;某些旧环境还不支持该 API。
寄生组合式继承通过显式修正解决:
- 创建中间函数后,立即执行
Child.prototype.constructor = Child - 子类实例既能通过
instanceof Parent验证继承关系 - 也能准确返回自身构造器,调试、序列化、工厂模式都更安全
现代写法推荐 class + extends
ES6 的 class 和 extends 不是新机制,而是寄生组合式继承的语法糖封装:
- 自动完成原型链接、
constructor修正、super绑定 - 支持静态方法继承、
new.target、私有字段等扩展能力 - 只要运行环境支持(2026 年绝大多数环境已无兼容性顾虑),应直接使用
class
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











