寄生组合式继承通过object.create(super.prototype)避免父类构造函数被调用两次:经典组合继承中,super.call(this)和new super()各执行一次,导致性能浪费及实例属性挂到原型上;寄生式仅复用原型而不执行构造函数,并修正constructor指向。

用寄生组合式继承替代经典组合继承,就能避免父类构造函数被调用两次。
问题出在哪儿?
经典组合继承中,父构造函数被调用两次:
- 第一次:在子类构造函数里用 Super.call(this) 初始化实例属性
- 第二次:在设置 Sub.prototype = new Super() 时,为继承原型方法而创建父类实例,触发构造函数执行
这不仅浪费性能,还会把本该属于实例的属性(比如 this.name)错误地挂到子类原型上,造成冗余和语义混乱。
核心解法:只复用原型,不执行构造
关键不是“new 一个父类”,而是“拿到父类原型对象并干净地继承它”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 Object.create(Super.prototype) 创建一个空对象,它的
__proto__直接指向Super.prototype - 这样既继承了所有原型方法,又完全绕过了
Super()的执行 - 再把新对象的
constructor指回子类,保持构造器语义正确
标准写法示例
封装一个复用函数更清晰:
function inherit(Child, Parent) {
const proto = Object.create(Parent.prototype);
proto.constructor = Child;
Child.prototype = proto;
}
function Super(name) {
this.name = name;
}
Super.prototype.say = function() {
return this.name;
};
function Sub(name, age) {
Super.call(this, name); // 只在这里调用一次
this.age = age;
}
inherit(Sub, Super); // 不再用 new Super()
此时 new Sub('Alice', 25) 只执行一次 Super 构造函数,Sub.prototype 上也没有冗余的 name 属性。
ES6 class 是它的语法糖
你写的 class Sub extends Super,底层就是寄生组合式继承的实现逻辑。它自动处理了原型链连接和构造函数调用时机,所以开发者无需手动处理两次调用的问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










