寄生组合式继承借助Object.create(Parent.prototype)创建子类原型并手动修复constructor,仅一次调用父类构造函数,既避免冗余执行父类逻辑,又维持完整原型链与正确实例类型,堪称最理想的继承实现方式。
寄生组合式继承是目前最理想的继承模式,它通过Object.create(Parent.prototype)创建子类原型并手动修正constructor,避免父类构造函数被调用两次,同时保证原型链完整、构造函数正确及实例类型准确。

先给结论:寄生组合式继承是目前最理想的继承模式,它完美解决了组合式继承中父类构造函数被调用两次的尴尬,同时保留了原型链的完整性与构造函数的正确性。说白了,就是既省了性能,又保证了语义准确。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
关键在于用 Object.create(Parent.prototype) 创建子类原型,而不是直接走 new Parent()。这样做的妙处是:父类原型上的方法全部继承过来了,但父类的构造逻辑不会提前执行——比如父类构造里可能有打印日志、发起网络请求之类的副作用,统统不会在设置原型时触发。然后,再通过 Parent.call(this, ...) 在子类实例化时补上构造初始化,一步到位。
封装一个 inherit 函数,以后每次继承直接调用,干净利落:
function inherit(SubType, SuperType) {
const prototype = Object.create(SuperType.prototype);
prototype.constructor = SubType;
SubType.prototype = prototype;
}
实际用起来就像这样:
function Animal(name) { this.name = name; }
Animal.prototype.say = function() { console.log(this.name); };
function Dog(name, breed) {
Animal.call(this, name); // 只在这里调用父类构造
this.breed = breed;
}
inherit(Dog, Animal); // 设置原型链
Dog.prototype.bark = function() { console.log('Woof!'); };
如果不手动设置 SubType.prototype.constructor = SubType,那就会出个小坑:new Dog() 实例的 constructor 会指向 Animal,导致 typeof Dog === 'function' 但实例.constructor === Animal。虽然 instanceof 不受影响,但在调试或依赖 constructor 做类型判断的场景下就会翻车。
相比原型链继承(无法传参)、借用构造函数(丢失原型方法)、组合式继承(父类构造执行两次),寄生组合式继承真正做到了:
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述