寄生式继承的核心是“先继承,再增强”,基于原型式继承创建新对象后动态添加专属方法或属性并返回,不修改原对象,适合临时扩展、避免污染,常作寄生组合式继承的底层支撑。

寄生式继承的核心是“先继承,再增强”,它不直接修改原对象,而是基于原型式继承创建新实例,然后动态添加专属方法或属性,最后返回这个增强后的新对象。这种方式适合临时扩展、避免污染原对象,也常作为寄生组合式继承的底层支撑。
寄生式继承的基本步骤
它本质是对原型式继承(Object.create 或手动构造函数模拟)的封装和增强:
- 用原型式继承方式创建一个新对象(即让新对象的
[[Prototype]]指向原对象) - 给这个新对象动态添加方法、属性或重写已有行为
- 返回该增强后的对象,不改变原始模板
用 Object.create 实现更简洁的寄生式扩展
ES5 提供的 Object.create 是原型式继承的标准写法,配合工厂函数即可轻松实现寄生式继承:
function createEnhancedBook(original) {
const book = Object.create(original); // 继承 original 的所有可枚举属性和方法
book.getName = function() {
return this.name;
};
book.clone = function() {
return Object.create(this); // 支持链式增强
};
return book;
}
const baseBook = { name: 'JS Guide', tags: ['frontend', 'advanced'] };
const enhanced = createEnhancedBook(baseBook);
enhanced.name = 'ES6 Deep Dive';
console.log(enhanced.getName()); // 'ES6 Deep Dive'
console.log(enhanced.tags); // ['frontend', 'advanced'](继承而来)
注意引用类型共享问题
寄生式继承仍基于原型链,所以对引用类型(如数组、对象)的修改会影响所有共享该原型的对象:
立即学习“Java免费学习笔记(深入)”;
- 如果
baseBook.tags.push('es6'),所有通过Object.create(baseBook)创建的对象都会看到这个变化 - 若需隔离状态,应在增强阶段深拷贝引用属性,例如:
book.tags = [...original.tags] - 或者改用构造函数+call 继承实例属性,再结合寄生式补充原型方法(即寄生组合式继承)
适用场景与替代建议
寄生式继承不是用来构建复杂类体系的主力方案,更适合轻量、一次性、面向对象程度不高的扩展需求:
- 为第三方库返回的对象快速添加辅助方法(如
toJson()、isValid()) - 测试中模拟带行为的假数据对象
- 在不支持 class 语法的老环境里做简单对象定制
- 真正需要复用和层级管理时,应优先考虑 ES6
class+extends或寄生组合式继承


















