寄生组合式继承将“继承什么”与“怎么继承”分离:实例属性通过SuperType.call(this)独立初始化,共享方法通过Object.create(SuperType.prototype)轻量继承原型,解耦冗余初始化,逻辑更纯粹。

寄生组合式继承的逻辑抽象很清晰:它把“继承什么”和“怎么继承”做了明确分离。
继承目标拆解为两类
它把父类内容自然分成两块:
-
实例属性(含私有状态):比如
this.name、this.colors = ["red"],每个子类实例都要独有一份,不能共享 -
共享方法与原型属性:比如
sayName()、toString(),所有实例共用一份,放在原型上最合理
继承手段各司其职
对应上面两类目标,它用两种机制分别处理:
-
构造函数借用(
SuperType.call(this, ...)):只负责初始化实例属性,确保每次 new 都得到干净独立的状态 -
原型副本替换(
Object.create(SuperType.prototype)):只负责把父类的方法链完整、轻量地接过来,不执行父类构造函数,避免冗余初始化
关键抽象在于“去耦”
传统组合继承的问题是:为了拿到父类原型,不得不调用一次 new SuperType(),结果把本该只属于实例的初始化逻辑(如 this.colors = [...])也提前跑了一遍,造成浪费和潜在副作用。
寄生组合式继承把这个耦合解开——它不依赖“父类实例”,而直接操作“父类原型”,把继承从“造一个父类对象来抄它的原型”升级为“复制原型本身”。这使得逻辑更纯粹:属性归构造函数管,方法归原型链管,彼此不干扰。
抽象层级贴近语义本质
它没有引入新概念,而是把 JavaScript 原生机制(call、Object.create、prototype)组织成更符合直觉的分工模型。开发者理解时不需要记住“寄生”“组合”这些术语,只需想清楚:
- 哪些东西每个实例必须自己有?→ 用
call拿 - 哪些东西大家共用就行?→ 用
Object.create接原型
这种抽象不增加心智负担,反而让继承行为更可预测、更易调试。

















