寄生组合式继承是目前 JavaScript 中最推荐的继承实现方式,它通过 Object.create(Parent.prototype) 创建子类原型并用 Parent.call(this) 初始化实例,仅调用一次父类构造函数,避免冗余且完整保留原型链与实例属性归属。

寄生组合式继承是目前 JavaScript 中最推荐的继承实现方式,它规避了传统组合继承中父类构造函数被调用两次的问题,同时完整保留原型链关系和实例属性的正确归属。
核心原理:只调用一次父类构造函数
寄生组合式继承的关键在于:用 Object.create(Parent.prototype) 创建干净的子类原型对象,再将 constructor 指回子类;然后在子类构造函数中,用 Parent.call(this, ...args) 初始化实例属性。这样既复用了父类方法(通过原型),又避免了重复执行父类构造逻辑。
标准实现步骤
- 定义父类构造函数和原型方法
- 创建子类构造函数
- 用 Object.create(Parent.prototype) 设置子类的 prototype,确保原型链连通
- 手动修复子类 prototype 的 constructor 属性(指向 Sub)
- 在子类构造函数内部,用 Parent.call(this, ...args) 继承实例属性
一个可直接使用的封装函数
为避免每次手写重复逻辑,可封装一个 inherit 工具函数:
function inherit(Sub, Super) {
const prototype = Object.create(Super.prototype);
prototype.constructor = Sub;
Sub.prototype = prototype;
}
// 使用示例:
function Animal(name) { this.name = name; }
Animal.prototype.say = function() { return `I'm ${this.name}`; };
function Dog(name, breed) {
Animal.call(this, name); // 实例属性继承
this.breed = breed;
}
inherit(Dog, Animal); // 原型方法继承
Dog.prototype.bark = function() { return 'Woof!'; };
为什么它是最优?对比其他方式
- 原型链继承:无法传参给父类构造函数,且所有实例共享引用类型属性
- 借用构造函数:无法复用父类方法,每次实例化都新建方法,浪费内存
- 组合继承:父类构造函数被调用两次(一次在设置 prototype 时,一次在子类 new 时),造成冗余初始化
- 寄生组合式继承:仅一次父类构造调用 + 完整原型链 + 方法复用,无冗余,语义清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











