ES6通过继承与方法重写实现运行时多态:子类用相同签名重写父类方法,调用时依据实例原型链动态绑定;需保持接口一致(参数、返回值、语义),可选super调用父类逻辑,本质是原型链单一分发,非重载。

ES6 类本身不直接提供“多态”关键字,但通过继承 + 方法重写(覆盖),可以自然实现运行时多态行为——即同一方法调用,根据实例的实际类型执行不同逻辑。
继承父类并重写方法
子类用 相同名称和参数签名定义方法,就会覆盖父类中的同名方法。调用时,JavaScript 依据对象真实构造函数(即 this 的原型链)决定执行哪个版本。
例如:
class Animal {
speak() {
return "Some sound";
}
}
class Dog extends Animal {
speak() { // ✅ 重写父类方法
return "Woof!";
}
}
class Cat extends Animal {
speak() { // ✅ 同样重写
return "Meow!";
}
}
const animals = [new Dog(), new Cat()];
animals.forEach(animal => console.log(animal.speak()));
// 输出:Woof! → Meow!
保持接口一致是多态的前提
多态有效依赖“统一接口”。所有子类应保证重写后的方法:
立即学习“Java免费学习笔记(深入)”;
- 接受相同数量和类型的参数(至少兼容父类签名)
- 返回可互换的值(如都返回字符串、都返回 Promise 等)
- 不擅自改变方法语义(比如父类
save()表示持久化,子类不应重写为打印日志)
否则调用方无法安全地统一处理,就失去了多态意义。
可选:在重写中调用父类实现(super)
如果子类逻辑需要复用父类行为,可用 super.methodName() 显式调用:
class Bird extends Animal {
speak() {
return super.speak() + " — and I can fly!";
}
}
// new Bird().speak() → "Some sound — and I can fly!"
这属于“扩展式重写”,既保留共性,又注入特性,是常见且健壮的多态实践。
注意:不是重载,而是覆盖
JavaScript 不支持传统 OOP 中的“方法重载”(同名但参数不同)。ES6 类中只有运行时动态查找的**单一分发机制**:方法调用永远基于 this 当前对象的原型链,找到第一个匹配的方法就执行。所谓“多态”,本质就是这个查找过程的结果因实例类型而异。


















