javascript通过原型链实现多态:调用同名方法时,引擎沿__proto__逐级查找,执行对象实际拥有的版本;构造函数或es6 class可模拟继承并重写方法;鸭子类型则仅要求对象具备对应方法,无需继承关系。

JavaScript 中没有传统类的多态机制,但通过原型链天然支持“同名方法、不同行为”的多态效果。关键不在于声明类型,而在于运行时对象实际拥有的方法——谁提供了 method(),就执行谁的逻辑。
原型链是多态发生的底层路径
调用 obj.doSomething() 时,JS 引擎会按顺序查找:
- 先在
obj自身属性中找doSomething - 没找到,就去
obj.__proto__(即构造函数的prototype)中找 - 还没找到,继续沿
__proto__向上,直到Object.prototype,最终到null
这个逐级查找过程,让不同对象即使共享同一调用形式,也能触发各自原型上定义的方法,形成表现一致、行为各异的多态效果。
用构造函数模拟“父类-子类”并重写方法
虽然 JS 没有原生类继承语法(ES6 class 是语法糖),但可通过原型赋值实现行为替换:
- 定义基础构造函数
Animal,在其prototype上添加say() - 定义
Dog和Cat构造函数,分别把它们的prototype指向Animal实例(或用Object.setPrototypeOf) - 在
Dog.prototype.say和Cat.prototype.say中各自重写逻辑
此时 new Dog().say() 和 new Cat().say() 调用的是同名方法,输出却不同——这就是原型链驱动的多态。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ES6 class 写法更直观,本质仍是原型操作
class 只是封装了原型继承的写法,多态逻辑没变:
class Animal { say() { console.log('sound'); } }class Dog extends Animal { say() { console.log('woof'); } }class Cat extends Animal { say() { console.log('meow'); } }
编译后,Dog.prototype.say 和 Cat.prototype.say 会覆盖 Animal.prototype.say。只要调用方只依赖 say() 这个接口,传入任意子类实例,就能自动执行对应版本——完全符合多态“可替换性”原则。
鸭子类型让多态更宽松
JavaScript 不检查对象“是不是某个类的实例”,只看它“有没有某个方法”:
- 一个普通对象
{ say() { console.log('quack'); } }也能被当作“动物”使用 - 只要它有
say方法,就能传给期望该接口的函数,无需继承关系 - 这种结构匹配(duck typing)降低了多态门槛,也强化了运行时动态性
所以,多态在 JS 中不是靠继承强制达成的,而是靠方法存在性 + 原型链查找 + 统一调用约定自然形成的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










