寄生式继承是在原型式继承基础上动态增强克隆对象的方法,先用object.create()创建原型链连接的干净克隆体,再为其直接添加专属属性和方法,实现解耦、轻量、临时的实例级扩展。

寄生式继承本质上就是建立在原型式继承之上的增强手段,它不替代原型式继承,而是“在其结果上做加法”——先用原型式继承得到一个新对象,再动态添加专属方法或属性。
原型式继承是基础,提供共享结构
原型式继承的核心是 Object.create(original) 或类似函数(如早期的 object()),它创建一个新对象,其 __proto__ 指向原对象,从而复用原对象的属性和方法。这个过程不涉及构造函数,纯粹是对象层面的委托关系。
- 它产出的是一个“干净”的克隆体,与原对象保持原型链连接
- 所有继承来的属性/方法都通过原型链查找,节省内存
- 但本身不提供定制能力——比如你无法在克隆时就附带一个
greet()
寄生式继承是封装,负责动态增强
寄生式继承把原型式继承包装进一个函数,在克隆之后立即对返回的对象进行扩展。它不是修改原对象,也不是污染原型,而是在克隆实例上直接挂载新行为。
- 增强逻辑由使用者定义,完全解耦:传什么函数,就加什么功能
- 新增方法属于该克隆对象自身(非原型),避免影响其他克隆体
- 比如给克隆后的
person加greet()和isAdult(),这些方法只属于当前实例
两者结合的关键在于执行顺序和作用域
典型写法是:先用 Object.create(original) 得到克隆,再把这个克隆传给增强函数,在函数内部直接赋值方法或属性。注意 this 指向和闭包变量的使用要明确。
- 方法中访问
this.name是安全的,因为调用时this就是该克隆对象 - 若需访问外部数据(如配置、上下文),可用闭包捕获,而非依赖原型链
- 不推荐在增强函数里修改
original的原型,那会破坏封装性
适用场景很明确:临时对象、轻量扩展、无需类型约束
当你只需要基于某个现成对象快速生成一个“带额外能力”的副本,又不想定义类、不关心 instanceof,也不打算大量复用同一套增强逻辑时,这种组合就很自然。
- 例如:从配置对象克隆一个可执行校验的实例
- 再如:为 API 返回的数据对象临时附加格式化方法
- 不适合长期维护的复杂类型体系,那是寄生组合式继承或 class 的领域











