寄生组合式继承通过子类构造函数中调用Parent.call(this, ...args)实现实例属性隔离,确保每个实例独享数据空间;原型链仅复用方法,避免父类构造函数重复执行及副作用。

寄生组合式继承通过在子类构造函数中显式调用 Parent.call(this, ...args) 来处理实例属性的隔离。
每个实例独享一份数据空间
父类构造函数中的 this 指向当前正在创建的子类实例,因此所有用 this.xxx = value 初始化的属性(包括字符串、数字、对象、数组等)都会被写入该实例自身,而不是共享在原型上。
- 比如
this.items = [],每个子类实例都有自己的空数组,互不影响 - 引用类型(如对象、数组)不会被多个实例意外共享,避免了原型链继承的典型陷阱
- 原始类型(如
this.name = 'xxx')自然独立,无需额外处理
不依赖原型链传递实例数据
它明确区分“实例属性”和“原型方法”:前者靠构造函数执行时的 call 注入,后者靠 Object.create(Parent.prototype) 建立的原型链复用。这种分离确保了:
- 父类构造函数只运行一次,且仅作用于当前实例
- 子类实例的
this上直接拥有全部实例属性,读写不经过原型查找 - 即使父类构造函数中有副作用(如初始化状态、绑定事件),也不会因原型设置而被误触发
与组合继承的关键区别
组合继承会两次调用父类构造函数——一次在设置 Child.prototype = new Parent() 时,一次在子类构造函数内。这会导致原型上残留冗余属性(如 Child.prototype.name),还可能引发副作用重复执行。寄生组合式继承彻底规避了这一点:
- 原型链构建阶段完全不执行父类构造函数
- 实例属性初始化严格限定在子类构造函数内部
- 最终每个实例的属性都干净、独立、可预测

















