寄生组合继承是实际开发中效率最高的原型式继承写法,因其只调用一次父类构造函数、子类原型无冗余属性、完整保留原型链且方法复用在原型上。

原型继承本身不是一种“写法”,而是一种机制;真正影响效率的是具体实现方式。在所有基于原型链的继承方案中,寄生组合继承是实际开发中效率最高的原型式继承写法。
为什么寄生组合继承效率最高?
它解决了其他原型继承方式的核心性能缺陷:
- 只调用一次父类构造函数(避免组合继承中两次调用带来的冗余初始化)
- 子类原型上不残留父类实例属性(如多余的
this.xxx),减少内存占用 - 完整保留原型链结构,支持
instanceof和isPrototypeOf正常工作 - 方法复用在原型上,不重复创建函数实例
对比其他常见写法的效率短板
原型链继承:子类原型直接等于 new Parent(),导致父类构造函数执行时创建的引用类型(如数组、对象)被所有子类实例共享,既不安全也浪费初始化开销。
组合继承:父类构造函数被调用两次——一次用于设置子类原型,一次在子类构造函数内。第二次调用纯属冗余,尤其当父类构造逻辑复杂或涉及 DOM 操作时,明显拖慢实例化速度。
立即学习“Java免费学习笔记(深入)”;
构造函数继承(call/apply):虽避免共享问题,但把方法定义在构造函数内,每次 new 都新建函数对象,内存和 GC 压力显著上升。
寄生组合继承的标准实现
核心是用 Object.create(Parent.prototype) 替代 new Parent() 来设置子类原型,再手动修正 constructor:
function inheritPrototype(Child, Parent) {
const prototype = Object.create(Parent.prototype);
prototype.constructor = Child;
Child.prototype = prototype;
}
function Parent(name) {
this.name = name;
}
Parent.prototype.sayName = function() { console.log(this.name); };
function Child(name, age) {
Parent.call(this, name); // 只在此处调用一次
this.age = age;
}
inheritPrototype(Child, Parent); // 原型链干净高效
ES6 class 继承的底层其实也是它
class Child extends Parent 编译后或运行时的行为,本质上就是寄生组合继承的语法糖。现代引擎(V8、SpiderMonkey 等)对这种模式做了深度优化,包括原型链内联、constructor 调用路径简化等。所以直接使用 class 不仅可读性好,实际执行效率也不打折扣。


















