寄生组合继承是javascript最推荐的继承模式,它通过object.create(parent.prototype)设置子类原型并修复constructor,且仅在子类构造函数中调用一次parent.call(this),避免父类构造函数重复执行,完整保留原型链与实例属性隔离。

寄生组合继承是 JavaScript 中最推荐的继承模式,它规避了组合继承中父类构造函数被调用两次的问题,同时完整保留原型链关系和实例属性隔离。写法规范的核心在于:用 Object.create() 正确设置子类原型,且只在子类构造函数中调用一次父类构造函数。
正确设置子类原型链
子类的 prototype 必须继承自父类的 prototype,但不能直接赋值为父类实例(避免污染),也不能直接等于父类原型(会丢失 constructor)。标准做法是:
- 用
Object.create(Parent.prototype)创建干净的原型对象 - 手动修复
constructor指向子类构造函数
子类构造函数中仅调用一次父类构造
在子类构造函数内部,使用 Parent.call(this, ...args) 初始化实例属性。这是唯一调用父类构造函数的地方,确保实例属性不重复创建、不共享。
- 不依赖原型链上的父类构造调用
- 参数需显式透传,保持可读性和可控性
封装成可复用的 inherit 函数
为避免重复代码,可封装一个通用继承辅助函数,符合主流库(如 Babel)的实现逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function inherit(Child, Parent) {
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
}
使用时清晰简洁:
function Animal(name) { this.name = name; }
Animal.prototype.say = function() { return `I'm ${this.name}`; };
function Dog(name, breed) {
Animal.call(this, name); // 只调用一次
this.breed = breed;
}
inherit(Dog, Animal); // 设置原型链
Dog.prototype.bark = function() { return 'Woof!'; };
ES6 class 语法已内置等效逻辑
现代开发中,class + extends 就是寄生组合继承的语法糖,Babel 和 TypeScript 编译后生成的代码正是上述模式:
class Animal {
constructor(name) { this.name = name; }
say() { return `I'm ${this.name}`; }
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 等价于 Animal.call(this, name)
this.breed = breed;
}
bark() { return 'Woof!'; }
}
除非需要兼容极老环境或深度定制,否则直接使用 class 是最规范、最安全的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










