javascript原型链不支持多重继承,但可通过混入(object.assign)、mixin类工厂、proxy动态查找及手动合并构造函数与原型链四种方式模拟。

JavaScript 原型链本身不支持多重继承,因为每个对象的 __proto__ 只能指向一个原型对象,形成单条向上的查找链。但可以通过组合、代理或混入等策略,在行为层面模拟“同时拥有多个父源能力”的效果。
用 Object.assign 混入多个原型方法
这是最直接、轻量且广泛应用的方式:不改变原型链结构,而是把多个来源的方法复制到目标类的 prototype 上,实现共享方法的叠加。
- 在类定义后,一次性合并多个 mixin 对象:
Object.assign(MyClass.prototype, Flyable.prototype, Swimmable.prototype); - 同名方法按顺序覆盖,后混入的会取代先混入的
- 仅复制可枚举的自有属性,无法自动处理 getter/setter 或 Symbol 属性,需额外遍历处理
用高阶函数构建可嵌套的 Mixin 类工厂
通过函数接收基类、返回新类,让多个能力像管道一样层层增强,保持原型链清晰,也便于复用和测试。
- 每个 Mixin 是一个函数,例如:
const Flyable = (Base) => class extends Base { fly() { return "Flying"; } }; - 组合使用:
class Duck extends Flyable(Swimmable(Animal)) {} - 构造函数中必须调用
super(),确保各层初始化逻辑执行
用 Proxy 实现多源属性动态查找
当需要更接近传统多继承的“运行时就近查找”语义时,可在实例层面用 Proxy 拦截属性访问,依次检查多个能力提供者。
- 创建多个能力实例(如
new FlyBehavior(),new SwimBehavior()) - 在目标类中封装它们,并用 Proxy 的
get拦截器按优先级顺序查找:
先查自身 → 再查 FlyBehavior → 再查 SwimBehavior - 配合
Reflect.get和in判断归属,避免硬编码调用链
手动调用多个构造函数 + 合并原型链
在子类构造函数中用 call 分别执行多个父类构造函数,再用 Object.assign 或 Object.getOwnPropertyDescriptors 把它们的原型方法合并进来。
- 继承实例属性:
Father.call(this, ...args); Mother.call(this, ...args); - 继承原型方法:
Object.assign(Child.prototype, Father.prototype, Mother.prototype); - 注意修复
constructor指针,避免类型识别异常:Child.prototype.constructor = Child;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











