javascript多态本质是同一方法调用因对象不同执行不同逻辑,依赖运行时原型链查找和鸭子类型,要求接口一致以保障可替换性。

JavaScript 中的多态性,本质是“同一方法调用,因对象不同而执行不同逻辑”,不依赖类型声明,靠运行时动态查找方法实现。
核心机制:原型链上的方法查找
调用 obj.method() 时,JS 引擎会顺着 obj.__proto__ 逐级向上找 method,直到找到为止。哪个对象提供了该方法,就执行哪个版本——这天然支持多态。
- 父类定义通用方法名(如
speak()),只约定“做什么” - 子类按需重写同名方法,各自决定“怎么做”
- 调用方无需判断类型,直接调用,行为自动适配
典型实现方式:继承 + 方法重写
使用 class 和 extends 建立继承关系,子类用相同签名重写父类方法:
class Animal {
speak() { return "Some sound"; }
}
class Dog extends Animal {
speak() { return "Woof!"; }
}
class Cat extends Animal {
speak() { return "Meow!"; }
}
const pets = [new Dog(), new Cat()];
pets.forEach(pet => console.log(pet.speak())); // Woof! → Meow!
这里 speak() 是统一接口,但每个实例执行的是自己原型上的版本。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
更轻量的体现:鸭子类型 + 普通对象
不需要 class 或继承,只要对象有同名方法,就能参与多态:
- 定义通用操作函数:
function makeSound(animal) { animal.sound(); } - 准备不同结构的对象:
const duck = { sound() { console.log("嘎嘎"); } };、const chicken = { sound() { console.log("咯咯"); } }; - 直接传入调用:
makeSound(duck); makeSound(chicken);
没有继承关系,也不检查类型,只看“有没有 sound 方法”——这就是 JavaScript 原生的鸭子类型多态。
关键前提:保持接口一致性
多态能稳定工作的基础是“可替换性”。子类或对象重写方法时,应尽量保证:
- 参数个数和含义一致(比如都接受一个
volume参数) - 返回值类型兼容(如都返回字符串,或都返回 Promise)
- 语义不变(
save()就该持久化,不该变成打印日志)
否则调用方无法安全地统一处理,多态就退化成隐式条件分支。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










