寄生组合式继承通过Object.create(Parent.prototype)创建空对象继承父类原型方法,仅调用一次父类构造函数,避免经典组合继承中因Sub.prototype = new Parent()导致的两次调用及属性冗余问题。

寄生组合继承通过只调用一次父类构造函数,同时让子类原型干净地继承父类原型方法,直接解决经典组合继承中父类构造函数被调用两次的问题。
为什么原型会多次调用父类构造函数
经典组合继承写法中,父类构造函数执行两次:
- 第一次在子类构造函数内:`Parent.call(this, ...)` —— 正常初始化实例属性
- 第二次在设置原型时:`Child.prototype = new Parent()` —— 仅为继承方法,却意外触发构造逻辑,还把父类实例属性(如数组、对象)挂到原型上,造成共享和内存浪费
寄生组合继承的核心操作
不创建父类实例,只复用其原型对象:
- 用 Object.create(Parent.prototype) 创建一个空对象,它的
__proto__直接指向父类原型,从而继承所有方法 - 手动把该对象的 constructor 指回子类构造函数,避免丢失语义
- 将子类的 prototype 指向这个新对象,完成原型链搭建
标准写法示例
封装成可复用的工具函数更清晰:
function inherit(Child, Parent) {
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
}
使用时保持简洁:
- 子类构造函数中仅调用一次 Parent.call(this, ...)
- 之后调用 inherit(Dog, Animal) 设置原型关系
- 所有方法都定义在父类原型上,子类实例互不干扰
ES6 class 是它的语法糖
class Dog extends Animal 在编译后(如 Babel)生成的代码,正是上述寄生组合继承逻辑。现代开发中优先用 class,但理解底层实现有助于排查原型链异常、调试 constructor 指向错误等问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











