javascript 多态依赖运行时动态方法查找而非 class 语法,通过子类重写、鸭子类型、高阶函数及封装机制共同实现:子类继承父类并重写方法;函数只检查对象是否有对应方法;高阶函数传递行为策略;getter/setter 和私有字段保障状态可控,提升多态可靠性。

JavaScript 中 class 语法糖本身不提供多态能力,它只是让多态的表达更清晰、结构更易读;真正起作用的是运行时动态方法查找机制——只要对象有对应方法,调用就自动走该实现,和类型无关。
通过子类重写父类方法实现运行时多态
这是最接近传统 OOP 多态的写法。父类定义通用接口(如 move()),子类各自实现,调用时根据实例真实类型自动执行对应逻辑:
- 父类方法可抛出错误作为“抽象占位”,提示必须被覆盖
- 子类用 extends 继承,并在同名方法中提供具体行为
- 函数接收父类类型参数,但实际传入任意子类实例,调用仍正确分发
依赖鸭子类型,不检查构造器或 class 名
多态不靠 instanceof 或 class 名判断,只看对象有没有所需方法:
- draw(shape) 函数不关心 shape 是不是 Circle 实例,只调 shape.draw()
- 普通对象、字面量、其他 class 实例,只要带 draw() 方法,就能被统一处理
- 这种松耦合正是 JavaScript 多态自然、轻量的核心体现
结合高阶函数,把行为作为参数传递
把“变化的部分”抽出来,让同一逻辑适配不同策略,也是一种多态形式:
- 例如 sort(arr, compareFn),compareFn 可以是数字比大小、字符串按长度、对象按字段排序
- 主函数 sort 不变,行为由传入函数决定,实现了接口一致、实现各异
- 这比继承更灵活,适合组合优于继承的场景
getter/setter 和私有字段增强封装,间接支撑多态可靠性
虽然不直接参与多态分发,但它们让对象内部状态更可控,避免因数据非法导致方法行为错乱:
- 用 set age(value) 拦截赋值,确保后续 get description() 逻辑稳定
- 私有字段 #cache 防止外部误改,保障 calculate() 方法每次结果可信
- 封装越扎实,多态调用时各实现分支的行为就越可预期
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











