寄生组合式继承是目前JavaScript中最推荐的继承方式,它通过Object.create(Parent.prototype)创建父类原型副本并修复constructor,既复用方法又隔离实例属性,支持传参且避免引用类型共享。

寄生组合式继承是目前 JavaScript 中最推荐、最主流的继承实现方式,它融合了原型链继承和构造函数继承的优点,同时规避了它们各自的缺陷——既复用父类方法,又确保每个实例拥有独立的属性。
为什么寄生组合式继承更优?
它解决了两种经典方案的痛点:
- 原型链继承:子类实例共享父类引用类型属性(如数组、对象),修改一处影响所有实例;且无法向父构造函数传参。
- 借用构造函数(call/apply):虽能传参、避免属性共享,但父类方法无法复用,每次创建实例都重新生成一份,浪费内存。
寄生组合式继承通过 Object.create() 创建干净的父类原型副本,再修正子类构造函数指向,让子类原型既不污染父类原型,又能正确继承方法,还支持实例属性隔离与参数传递。
核心实现步骤
只需四步,即可完成标准寄生组合式继承:
立即学习“Java免费学习笔记(深入)”;
- 定义父构造函数(含实例属性)和原型方法
- 定义子构造函数,在内部用
Parent.call(this, ...args)继承实例属性 - 用
Object.create(Parent.prototype)创建父类原型副本,赋给Child.prototype - 修复
Child.prototype.constructor指回Child
一个可直接运行的示例
下面是最简、无依赖的标准写法:
function Parent(name) {
this.name = name;
this.colors = ['red', 'blue'];
}
Parent.prototype.sayName = function() {
console.log(this.name);
};
function Child(name, age) {
Parent.call(this, name); // 继承实例属性(可传参)
this.age = age;
}
// 关键:寄生 —— 用 Object.create 建立原型链,不执行 Parent 构造函数
Child.prototype = Object.create(Parent.prototype);
// 修复 constructor
Child.prototype.constructor = Child;
// 添加子类特有方法
Child.prototype.sayAge = function() {
console.log(this.age);
};
const c1 = new Child('Alice', 25);
const c2 = new Child('Bob', 30);
c1.colors.push('green');
console.log(c1.colors); // ['red', 'blue', 'green']
console.log(c2.colors); // ['red', 'blue'] ← 独立副本,无共享
c1.sayName(); // 'Alice'
c1.sayAge(); // 25
现代开发中的补充说明
ES6 的 class 和 extends 语法底层正是基于寄生组合式继承思想实现的。Babel 编译后的辅助函数 _inherits 就封装了上述逻辑。因此,日常使用 class 时,你已经在享受它的优势——只是无需手动编写。
若需兼容老旧环境或深入理解原理,手写该模式仍具价值;但在新项目中,优先使用 class 语法即可,语义清晰、工具链友好、不易出错。


















