寄生组合式继承通过object.create(parent.prototype)建立原型链且不执行父构造函数,再在子类构造函数中调用parent.call(this)初始化实例属性,确保父类构造函数仅执行一次、引用类型不共享、无冗余实例。

寄生组合式继承通过分离“原型链建立”和“实例属性初始化”两个动作,确保父类构造函数只执行一次——仅在子类实例化时调用,不因设置原型而触发冗余执行。
它不走 Child.prototype = new Parent() 这条老路
传统组合继承中,Child.prototype = new Parent() 会立即执行一次父类构造函数,生成一个临时实例作为子类原型,导致 this.tags = ['js', 'web'] 这类引用类型被挂到 Child.prototype 上,所有子类实例共享,既危险又浪费。寄生式写法直接跳过这步。
用 Object.create(Parent.prototype) 创建干净原型
这个方法只创建一个空对象,其内部 [[Prototype]] 指向 Parent.prototype,不运行 Parent 构造函数,也不产生任何实例属性。原型链有了,但没副作用。
constructor 手动修正,保持语义正确Object.create 创建的对象 constructor 指向 Parent,所以要补一句 prototype.constructor = Child,让 new Child() 实例的 constructor 正确回指。
子类构造函数里只 call 一次Parent.call(this, name) 放在 Child 构造函数体内,确保每个实例独有自己的一份 name、tags 等属性,且可传参、可控制执行时机。
- 避免了原型上挂载引用类型(比如空数组被多个实例意外共享)
- 没有多余的内存分配(不用为原型造一个无用的父类实例)
- 方法全部复用
Parent.prototype上的定义,零重复 - 若父类构造函数里有耗时操作(如初始化大型对象、模拟请求),只在真正需要时执行











