js 多态实现
多态的基本概念
多态是面向对象编程的三大特性之一,指同一操作作用于不同对象时产生不同的行为。JavaScript 通过原型链和动态类型实现多态。
基于原型链的多态实现
JavaScript 使用原型继承实现多态。通过重写原型方法,子类可以覆盖父类行为。
function Animal() {}
Animal.prototype.sound = function() {
console.log('Animal makes a sound');
};
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.sound = function() {
console.log('Dog barks');
};
const animal = new Animal();
const dog = new Dog();
animal.sound(); // Animal makes a sound
dog.sound(); // Dog barks
基于类的多态实现(ES6+)
ES6 引入 class 语法糖,可以更直观地实现多态。
class Animal {
sound() {
console.log('Animal makes a sound');
}
}
class Dog extends Animal {
sound() {
console.log('Dog barks');
}
}
const animal = new Animal();
const dog = new Dog();
animal.sound(); // Animal makes a sound
dog.sound(); // Dog barks
鸭子类型实现多态
JavaScript 是动态类型语言,不检查对象类型而关注对象是否具有特定方法或属性。

function makeSound(animal) {
if (animal && typeof animal.sound === 'function') {
animal.sound();
}
}
const myDog = {
sound: () => console.log('Woof!')
};
const myCat = {
sound: () => console.log('Meow!')
};
makeSound(myDog); // Woof!
makeSound(myCat); // Meow!
多态的应用场景
- 插件系统:不同插件实现相同接口但行为不同
- UI组件:基础组件和定制组件共享接口
- 算法策略:不同策略对象实现相同方法
注意事项
- 原型方法重写时注意正确设置原型链
- 使用 class 语法时注意 super 调用
- 鸭子类型需要良好的文档约定
- 类型检查可结合 TypeScript 增强安全性






