寄生继承是“原型式继承 + 工厂函数增强”,先用Object.create继承原对象,再通过工厂函数为新对象动态添加独有方法和私有状态,确保实例隔离且不污染原对象。

寄生继承本质是“原型式继承 + 工厂函数增强”,它不依赖构造函数或 class,而是先用 Object.create(或等效方式)创建一个基于原对象的新对象,再通过工厂函数为这个新对象动态添加专属方法和属性。
核心步骤:先继承,再增强
寄生继承的关键不在“新建类”,而在“复用已有对象结构 + 按需定制”。工厂函数在这里承担两个角色:封装继承逻辑、注入实例独有行为。
- 第一步:用
Object.create(original)创建新对象,继承原对象的原型链和共享属性 - 第二步:在工厂函数内部,直接给这个新对象添加方法(如
obj.sayHi = function(){...})或私有数据(如闭包变量、独立数组) - 第三步:返回该对象——它既拥有原对象的共性,又具备自己独有的能力,且与其他实例完全隔离
典型写法示例
下面是一个清晰、可复用的寄生继承工厂函数:
function createEnhancedPerson(original) {
const clone = Object.create(original); // 继承原型和已有属性
clone.greet = function() { return `Hello, I'm ${this.name}`; };
clone.hasGreeted = false;
clone.markAsGreeted = function() { this.hasGreeted = true; };
return clone;
}
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
使用时:
const personBase = { name: "Alice", age: 30 };const p1 = createEnhancedPerson(personBase);p1.greet(); // "Hello, I'm Alice"p1.markAsGreeted(); // 只影响 p1,不影响其他克隆对象
为什么必须用工厂函数?
因为寄生继承的目标是“每个实例独享增强逻辑”,而不能让方法挂在原型上被共享。工厂函数确保:
- 每次调用都生成全新函数实例(比如
greet是新函数,不是引用同一函数) - 可以自由引入闭包、私有状态(如计数器、临时缓存),这些不会泄漏到其他对象
- 避免修改原始对象或其原型,保持原对象纯净、可复用
和寄生组合继承的区别要分清
注意:这里说的“寄生继承”是基础版(针对对象),不是“寄生组合继承”(针对构造函数)。后者用于类式继承场景,需要配合 call 和 Object.create(Super.prototype);而前者更轻量,适合配置对象、DTO、插件化扩展等不需要类型识别的场合。










