寄生式继承的核心是基于已有对象创建新对象并添加专属属性和方法,不修改原对象、不依赖构造函数、不改变原型链;它通过Object.create()复制基础对象,再动态注入自有属性和方法,实现浅层封装与定制化增强。

寄生式继承的核心是:基于一个已有对象,创建新对象,并在新对象上添加专属属性和方法,而不影响原对象。它不依赖构造函数,也不修改原型链,而是“寄生”在原对象之上做增强。
寄生式继承如何扩展基础对象
寄生式继承本质是“浅层封装 + 属性/方法注入”。它通常分三步走:
- 先用
Object.create()或类似方式复制基础对象(避免直接修改) - 再给新对象动态添加自有属性或方法
- 最后返回这个增强后的对象
比如你有一个基础配置对象:
const baseConfig = {
theme: 'light',
lang: 'zh-CN',
timeout: 5000
};你想为某个插件单独扩展它,又不想污染全局配置,就可以这样寄生:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
function createExtendedConfig(base) {
const obj = Object.create(base); // 创建新对象,原型指向 base
obj.version = '2.1.0'; // 添加自有属性
obj.getFullInfo = function() { // 添加自有方法
return `${this.theme}-${this.lang}-v${this.version}`;
};
return obj;
}
const pluginConfig = createExtendedConfig(baseConfig);
console.log(pluginConfig.theme); // 'light'(继承自原型)
console.log(pluginConfig.version); // '2.1.0'(自有)
console.log(pluginConfig.getFullInfo()); // 'light-zh-CN-v2.1.0'注意引用类型属性的陷阱
如果基础对象里有数组、对象等引用类型,Object.create() 不会深拷贝,它们仍被共享:
const base = {
features: ['a', 'b'],
meta: { id: 1 }
};
const ext1 = createExtendedConfig(base);
ext1.features.push('c');
ext1.meta.name = 'plugin1';
const ext2 = createExtendedConfig(base);
console.log(ext2.features); // ['a', 'b', 'c'] ← 被意外修改了
console.log(ext2.meta.name); // 'plugin1' ← 同样被影响解决办法:在寄生过程中手动初始化引用类型:
function createExtendedConfig(base) {
const obj = Object.create(base);
obj.features = [...base.features]; // 浅拷贝数组
obj.meta = { ...base.meta }; // 浅拷贝对象
obj.version = '2.1.0';
return obj;
}和原型式继承的区别在哪
- 原型式继承(如
Object.create(parent))只建原型链,不做任何增强,返回的就是一个“裸”对象; - 寄生式继承一定包含“增强动作”——也就是在新对象上显式添加属性或方法,相当于给原型式继承加了一层定制化包装。
实际适合什么场景
- 配置对象的临时变体(如测试环境 vs 生产环境配置)
- 插件/模块对通用数据结构的轻量扩展(不需类、不需 new)
- 快速生成具有一组固定行为的工具对象(如
createLogger(config))
不复杂但容易忽略细节

















