寄生组合式继承分为实例属性初始化和原型链构建两个独立阶段:第一阶段用call/apply在子类构造函数中初始化独享实例属性;第二阶段用object.create(superclass.prototype)构建原型链并修复constructor,实现属性隔离与方法复用。

寄生组合式继承的逻辑可清晰拆分为两个独立阶段:实例属性初始化阶段和原型链构建阶段。这两个阶段职责分明、互不干扰,共同实现“属性隔离 + 方法复用”的核心目标。
第一阶段:实例属性初始化(靠 call/apply)
这一阶段发生在子类构造函数执行时,目的是为每个新实例创建独享的数据空间。
- 在子类构造函数内部,明确调用 SuperClass.call(this, ...args) 或 SuperClass.apply(this, arguments)
- 父类构造函数在此仅执行一次,且只作用于当前 this,确保 this.name、this.items = [] 等引用类型属性不被多个实例共享
- 若父类构造函数含副作用(如发请求、改全局状态),该设计能避免意外重复触发
第二阶段:原型链构建(靠 Object.create)
这一阶段发生在类定义阶段(非实例化时),目标是让子类原型干净地复用父类原型上的方法,同时不执行父类构造逻辑。
- 不使用 SubType.prototype = new SuperClass() —— 那会再次运行父构造函数并污染原型对象
- 改用 Object.create(SuperClass.prototype) 创建一个空对象,其 [[Prototype]] 直接指向 SuperClass.prototype
- 手动修复新原型的 constructor 属性:subProto.constructor = SubType,保障 instanceof 和调试工具识别准确
两个阶段协同的关键效果
只有当上述两阶段都存在且分离得当时,才能确认是标准的寄生组合式继承:
- 子类实例拥有自己的一份 this.state、this.props,彼此完全独立
- 所有实例共享 SuperClass.prototype 上的方法(如 render、componentDidMount),节省内存
- 原型链完整:instance.__proto__ → SubType.prototype → SuperClass.prototype → Object.prototype
- 父类构造函数全程只调用一次,无冗余开销











