js如何实现多态
多态的基本概念
多态是面向对象编程的三大特性之一,允许不同对象对同一消息做出不同响应。在JavaScript中,由于语言本身的动态特性,实现多态主要通过原型继承和对象方法重写来完成。

通过原型链实现多态
JavaScript基于原型链的继承机制天然支持多态。子类可以重写父类的方法,调用时会根据实际对象类型执行对应方法。

function Animal() {}
Animal.prototype.sound = function() {
console.log("Animal makes 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 sound
dog.sound(); // 输出: Dog barks
通过类语法实现多态
ES6的class语法糖让多态实现更直观。子类通过extends继承父类后,可重写父类方法。
class Shape {
draw() {
console.log("Drawing a shape");
}
}
class Circle extends Shape {
draw() {
console.log("Drawing a circle");
}
}
const shape = new Shape();
const circle = new Circle();
shape.draw(); // 输出: Drawing a shape
circle.draw(); // 输出: Drawing a circle
鸭子类型实现多态
JavaScript作为动态类型语言,可通过"鸭子类型"实现多态:只要对象具有相同方法名,不同对象可被统一处理。
function makeSound(animal) {
animal.sound();
}
const cat = {
sound: () => console.log("Meow")
};
const car = {
sound: () => console.log("Honk")
};
makeSound(cat); // 输出: Meow
makeSound(car); // 输出: Honk
多态的应用场景
- 接口统一:不同对象对外暴露相同接口
- 插件系统:允许第三方扩展核心功能
- 算法替换:运行时动态切换实现方式
- 测试替身:用Mock对象替换真实对象进行测试
注意事项
- 方法重写时可通过super调用父类实现
- 避免过度使用多态导致代码难以维护
- TypeScript的类型系统可帮助检查多态的正确性
- 性能考虑:方法查找比直接调用略慢






