JavaScript中子类重写父类方法实现多态,核心是子类定义同名方法覆盖父类方法,同时可通过super调用父类逻辑;体现“同一调用、不同行为”,依赖实例实际类型,支持动态绑定与选择性复用。

在 JavaScript 中,子类重写父类方法实现多态,核心是:**子类定义同名方法覆盖父类方法,同时可通过 super 调用父类原始逻辑**。多态体现为“同一调用,不同行为”——取决于实际实例的类型。
使用 class 和 extends 语法重写方法
ES6 的类语法让重写更清晰直观。只要子类中声明与父类同名的方法(包括构造函数、普通方法、getter/setter),就自动覆盖父类实现。
- 构造函数中若需复用父类初始化逻辑,必须显式调用
super() - 普通方法中可用
super.methodName()调用父类版本(可选,用于增强而非完全替换) - 重写后,通过父类引用指向子类实例时,调用的仍是子类方法(动态绑定)
一个典型多态示例
比如父类 Animal 有 makeSound() 方法,子类 Dog 和 Cat 各自重写:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class Animal {
makeSound() {
console.log("Some sound");
}
}
class Dog extends Animal {
makeSound() {
console.log("Woof!"); // 重写:完全替换
}
}
class Cat extends Animal {
makeSound() {
console.log("Meow!"); // 重写:完全替换
}
}
const animals = [new Dog(), new Cat()];
animals.forEach(animal => animal.makeSound()); // 输出 Woof! 和 Meow!
这里 animal 类型是 Animal,但运行时调用的是各自子类实现——这就是多态。
立即学习“Java免费学习笔记(深入)”;
选择性复用父类逻辑(模板模式)
有时需要“在父类基础上扩展”,而非完全替换。这时用 super 显式调用:
class Logger {
log(message) {
console.log(`[LOG] ${message}`);
}
}
class TimestampLogger extends Logger {
log(message) {
const now = new Date().toISOString();
super.log(`[${now}] ${message}`); // 复用父类格式,增加时间戳
}
}
new TimestampLogger().log("App started");
// 输出:[LOG] [2024-05-20T10:30:45.123Z] App started
注意点
- 箭头函数不能作为类方法被重写(它不绑定
this,也不参与原型链查找) - 静态方法也可重写,但需用
static关键字,且super在静态方法中指向父类本身 - 如果子类没写构造函数,会默认继承父类构造函数;一旦写了,就必须调用
super() - 重写不改变原型链结构,
instanceof仍能正确识别父子关系

















