组合寄生式继承通过一次定义、多处共享、实例隔离实现高效复用:方法存于父类原型供所有子类实例共用,属性在子类构造函数中用parent.call(this)独立初始化,支持多层级多子类继承且互不干扰。

组合寄生式继承实现代码复用,关键不在“多写几次”,而在于一次定义、多处共享、实例隔离。它让方法只存一份在原型上,所有实例共用;同时每个实例又拥有自己独立的属性,互不干扰。
让方法真正复用起来
父类定义在 prototype 上的方法(比如 sayName、getInfo),子类通过 Object.create(Parent.prototype) 建立原型链后,所有子类实例都能访问同一份函数体。浏览器不会为每个实例重新创建函数,内存占用低,调用路径清晰。
- 方法定义只写一次:
Parent.prototype.sayName = function() { ... }; - 子类无需重写,直接继承可用:
new Child().sayName()正常执行 - 修改父类方法,所有继承它的子类实例立即生效(无需改子类代码)
避免属性互相污染
构造函数中用 Parent.call(this, ...) 初始化实例属性,确保引用类型(如数组、对象)不被共享。
- 每个实例都有自己的
this.colors = ['red'],obj1.colors.push('blue')不影响obj2.colors - 即使父类构造函数里初始化了
this.data = {},子类实例也各自持有一份副本 - 不会出现“改一个,全跟着变”的 bug
支持多层级、多子类复用
一个父类可被多个子类继承,各子类之间完全独立,又都共享同一套父类方法。
-
Dog、Cat、Bird都继承Animal,它们的eat()、sleep()来自同一个Animal.prototype - 各自添加特有方法(如
Dog.prototype.bark)不影响其他子类 - 新增子类只需四步:定义构造函数 → call 父类 → create 原型 → 修 constructor,不破坏已有结构
配合工具函数进一步简化复用
把重复逻辑封装成通用函数,让继承更轻量、更一致:
function inherit(Child, Parent) {
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
}
之后任何新类都能快速接入:
function Button() { /* ... */ }
function IconButton() { Button.call(this); }
inherit(IconButton, Button); // 复用 Button 的所有原型方法
不复杂但容易忽略











