JavaScript类继承中实现多态的核心是方法重写与动态绑定:子类通过extends继承父类并重写同名方法,运行时根据实例实际类型自动调用对应版本,无需类型判断,支持松耦合扩展。

JavaScript 类继承中实现多态,核心在于“方法重写 + 动态绑定”——子类覆盖父类同名方法,调用时自动执行子类版本,无需显式判断类型。
必须有继承关系作为基础
多态不是孤立存在的,它依赖于明确的类继承结构。使用 class 和 extends 建立父子类关系,是现代 JS 实现多态最清晰的方式:
- 父类定义通用接口(如
speak()、move()) - 子类通过
extends继承父类,并可选择性地重写这些方法 - 即使不重写,子类实例也能直接调用父类方法(继承默认行为)
子类必须重写父类方法
重写(override)是触发多态的关键动作。只要子类中定义了与父类同名的实例方法,该方法就会在子类实例上调用时被优先执行:
- 重写时通常用
super.xxx()显式调用父类逻辑(如需复用) - 方法签名不需要严格一致(JS 是弱类型),但语义应保持兼容(比如都返回字符串、都接受零个参数)
- 构造函数中用
super()是强制的,否则报错;普通方法重写则完全自由
运行时动态决定调用哪个版本
JS 不在编译期检查类型,而是在调用方法那一刻,根据对象的实际构造函数和原型链,找到最近的有效实现:
立即学习“Java免费学习笔记(深入)”;
- 同一个函数接收不同子类实例,内部调用
obj.speak()会自然分发到对应子类的speak - 没有“父类引用指向子类对象”的强约束(如 Java 那样),但效果等价:你传
Dog或Cat,行为就自动不同 - 哪怕对象是字面量或工厂函数创建的,只要它有
speak方法,就能参与这种“鸭式多态”
统一处理不同子类的典型写法
把多态价值真正用起来,常见于抽象公共操作逻辑:
- 定义一个通用函数,参数只假设它有某个方法(如
render()或calculate()) - 函数体内直接调用该方法,不关心具体是哪个类的实例
- 新增子类时,只要实现该方法,原有函数无需修改即可支持
这种松耦合的设计,让扩展更安全,维护成本更低。


















