javascript中class多态核心是方法重写+父类引用调用子类方法,依赖this动态绑定实现运行时分发,无需接口或抽象类;可通过symbol或getter增强契约表达,但无编译检查,需靠文档、测试或typescript保障。

JavaScript 中用 class 语法实现多态,核心是**方法重写(override)+ 父类引用调用子类方法**,不需要接口或抽象类的强制约束,靠运行时动态绑定和约定达成。
子类重写父类同名方法
这是多态最直接的体现:不同子类对同一方法提供不同实现,调用时根据实际实例类型自动执行对应版本。
例如:
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!
利用 this 指向实现运行时动态分发
JavaScript 的 this 在方法调用时绑定到当前实例,所以即使通过父类定义的方法内部调用 this.xxx(),也会执行子类重写后的方法 —— 这是实现“晚绑定”的关键。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常见模式:
- 父类定义通用流程(如
run()),内部调用可被重写的方法(如move()) - 子类只重写
move(),不重复逻辑,但行为随类型变化
class Vehicle {
start() {
console.log("Engine starting...");
this.move(); // 调用子类实现
}
}
class Car extends Vehicle {
move() {
console.log("Driving on road");
}
}
class Plane extends Vehicle {
move() {
console.log("Flying in sky");
}
}
new Car().start(); // Engine starting... Driving on road
new Plane().start(); // Engine starting... Flying in sky
可选:用 getter/setter 或 Symbol 方法增强多态表达力
当需要更灵活的“行为契约”时,可以借助 get 访问器或 Symbol 键来定义统一接口,子类按需实现。
例如用 Symbol.for('action') 作为标准方法名:
const ACTION = Symbol.for('action');
class Command {
execute() {
return this[ACTION]();
}
}
class SaveCommand extends Command {
[ACTION]() {
return "Saving data...";
}
}
class LoadCommand extends Command {
[ACTION]() {
return "Loading data...";
}
}
console.log(new SaveCommand().execute()); // Saving data...
console.log(new LoadCommand().execute()); // Loading data...
注意点:没有编译期检查,靠文档和测试保障
JS 的 class 多态是鸭式(duck-typing)且运行时的:
- 不强制子类必须实现某方法;若未重写,就沿用父类逻辑或报错
- 建议在父类中抛出
throw new Error("Not implemented")占位,提示子类覆盖 - 配合 JSDoc 注释或 TypeScript 类型系统,能显著提升可维护性
class Shape {
area() {
throw new Error("Subclass must implement area()");
}
}
不复杂但容易忽略。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










