JavaScript不支持多重继承,因其原型链为单线性结构,每个对象仅有一个[[Prototype]];可通过Mixin模式横向组合行为、组合代替继承、ES6 class配合Mixin、Proxy委托四种方式复用多源能力。

JavaScript 不支持用 extends 实现多重继承,ES6 的 class 语法只允许一个父类——class A extends B, C 是语法错误,直接报错。
为什么不能多重继承?
因为 JavaScript 的原型链是单线性的:每个对象只有一个 [[Prototype]]。extends 的本质是设置子类的 prototype 指向父类原型,并建立构造函数间的关联,这天然排斥“同时继承两个父类”的结构。
- 语言层面没有菱形继承问题,但也没有提供多父类语法支持
-
extends后只能接一个构造函数(或null) - 试图写
class X extends Y, Z会触发SyntaxError
那怎么复用多个类的功能?
用 Mixin(混入)替代“继承”。它不是继承,而是把多个类的方法“复制”或“委托”到目标类上,实现能力组合。
- Mixin 通常是一个接收类、返回增强类的函数,比如
class Button extends mix(Clickable, Draggable) {...} - 可手动遍历源类的原型属性和静态成员,用
Object.defineProperty挂载到目标类或其原型上 - TypeScript 或现代框架(如 Lit)常内置 Mixin 工具,避免重复造轮子
组合比继承更推荐
比起强行模拟多重继承,更自然的做法是让类持有多个能力模块的实例,通过委托调用:
立即学习“Java免费学习笔记(深入)”;
- 例如:
this.logger = new Loggable(); this.serializer = new Serializable(); - 方法调用转为
this.logger.log(...)而非this.log(...) - 职责清晰、无命名冲突、易于测试和替换
继承链可以很长,但必须是单线
ES6 支持多级继承(A → B → C),也支持层次继承(B 和 C 都 extends A),这些都合法且常用:
-
class Animal {}→class Dog extends Animal {}→class Bulldog extends Dog {} - 所有祖先的方法都能通过原型链访问,
instanceof也逐级成立 - 只要每层都正确调用
super(),初始化顺序就有保障


















