寄生组合式继承是目前最被推荐的js继承方式,它融合构造函数与原型链继承优点:父类构造函数只执行一次、方法复用不浪费内存、支持传参、instanceof正常;缺点是写法繁琐、需手动修复constructor、初学者不友好、小型项目易过度设计。

寄生组合式继承是目前 JavaScript 中最被推荐的继承方式,它不是“完美无缺”,但确实在多数场景下达到了最佳平衡。
优点:精准、干净、可传参
它把构造函数继承和原型链继承的优点真正融合起来,同时避开各自的硬伤:
-
父类构造函数只执行一次:子类实例化时调用
Parent.call(this),不会在设置原型时再执行new Parent(),避免属性重复和引用类型意外共享 -
方法复用不浪费内存:通过
Object.create(Parent.prototype)复制原型对象,所有子类实例共享父类方法,不重复创建 -
支持向父类传参:子类构造函数里能灵活传递参数给父类,比如
Parent.call(this, name, age) - instanceof 和 isPrototypeOf 正常工作:原型链完整,类型判断和关系检测可靠
缺点:写法稍繁琐,理解门槛略高
相比简单粗暴的 call 或直接赋值原型,它需要多几步手动操作:
-
必须显式修复 constructor:
Child.prototype.constructor = Child这步容易遗漏,否则实例的constructor会指向Parent -
不能直接用 class 语法替代:ES6 的
class extends底层就是寄生组合式继承,但手写时需自己处理原型链,对初学者不够友好 -
过度设计风险:小型项目或单层继承中,用
call+ 手动挂方法也够用,强行套用反而增加维护成本
和其他继承方式对比的关键落点
它解决的是两个具体问题:
- 原型链继承的引用属性共享(如数组被多个实例共用)
- 组合继承的父构造函数调用两次(导致原型上多出一份无用的实例属性)
而寄生组合式继承恰好卡在这两个痛点之间:既隔离了实例数据,又复用了原型方法,没有冗余执行,也没有隐性副作用。











