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

寄生式继承的核心是:基于一个已有对象,创建新对象,并在新对象上添加专属属性和方法,而不影响原对象。它不依赖构造函数,也不修改原型链,而是“寄生”在原对象之上做增强。
寄生式继承如何扩展基础对象
寄生式继承本质是“浅层封装 + 属性/方法注入”。它通常分三步走:
- 先用
Object.create()或类似方式复制基础对象(避免直接修改) - 再给新对象动态添加自有属性或方法
- 最后返回这个增强后的对象
比如你有一个基础配置对象:
const baseConfig = {
theme: 'light',
lang: 'zh-CN',
timeout: 5000
};
你想为某个插件单独扩展它,又不想污染全局配置,就可以这样寄生:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
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))
不复杂但容易忽略细节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










