es6的extends是原生单继承机制,mixin是手动组合行为的模式;extends构建可追溯原型链且仅支持一个父类,mixin通过高阶函数复用多行为、不改变继承层级。

ES6 的 extends 是语言原生的单继承机制,而 Mixin 是一种手动组合行为的模式,并非语法特性——两者解决的问题不同,也不互为替代,而是常配合使用。
继承关系与原型链是否真实建立
extends 会构建完整的、可追溯的原型链:子类实例 instanceof 父类为 true,Object.getPrototypeOf(Child) === Parent 成立,方法查找严格按原型链顺序(子 → 父 → 祖)进行。
Mixin 不改变继承层级,它只是把方法“复制”或“挂载”到目标类的原型或构造函数上。混入后的类仍只继承一个父类,instanceof 不会多出其他类,也没有新增的原型链节点。
能否复用多个来源的行为
extends 仅允许一个直接父类,写成 class A extends B, C 会报语法错误。
- 想同时拥有“可拖拽”“可缩放”“带动画”三套能力?不能靠多
extends,得靠多个 Mixin 函数依次增强 - Mixin 本质是高阶函数:
const Enhanced = Draggable(Resizable(Animated(Base))),每一层返回一个新类 - 这种组合不依赖继承顺序,也避免了“钻石问题”——因为没有真正形成多条继承路径
构造函数与 this 初始化方式不同
使用 extends 的子类,必须在 constructor 中第一行调用 super(),否则无法访问 this;父类构造逻辑会先执行,再由子类加工。
Mixin 类中若含 constructor,它只是普通类的一部分,最终是否执行、何时执行,取决于它被嵌套在哪一层 extends 链中。Mixin 本身不强制调用规则,但通常会在其内部调用 super(),以确保底层父类被正确初始化。
静态成员与方法的传递逻辑
extends 会让父类的静态方法自动出现在子类上,例如 Parent.staticFn() 可直接通过 Child.staticFn() 调用。
Mixin 一般不处理静态成员——除非显式在 Mixin 函数中将静态属性赋值给目标类,比如:
const WithLog = (SuperClass) => {<br> class Mixed extends SuperClass {<br> // 实例方法...<br> }<br> Mixed.log = () => console.log('static log');<br> return Mixed;<br>}











