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
基于方法重写的多态
同一方法在不同对象中表现不同行为:

class Bird {
fly() {
console.log('Bird can fly');
}
}
class Penguin extends Bird {
fly() {
console.log('Penguin cannot fly');
}
}
const bird = new Bird();
const penguin = new Penguin();
bird.fly(); // 输出: Bird can fly
penguin.fly(); // 输出: Penguin cannot fly
基于鸭子类型的多态
JavaScript是动态类型语言,通过检查对象是否具有特定方法实现多态(“鸭子类型”):
function makeSound(animal) {
if (animal && typeof animal.sound === 'function') {
animal.sound();
}
}
const cat = { sound: () => console.log('Meow') };
const car = { sound: () => console.log('Honk') };
makeSound(cat); // 输出: Meow
makeSound(car); // 输出: Honk
使用Symbol实现多态
通过唯一Symbol键避免属性名冲突,实现更灵活的多态:
const soundKey = Symbol('sound');
class Cat {
[soundKey]() {
console.log('Purr');
}
}
const lion = {
[soundKey]() {
console.log('Roar');
}
};
function triggerSound(obj) {
if (obj[soundKey]) obj[soundKey]();
}
const cat = new Cat();
triggerSound(cat); // 输出: Purr
triggerSound(lion); // 输出: Roar
多态的应用场景
- 插件系统:统一接口,不同插件实现不同功能
- UI组件:基类定义渲染接口,子类实现具体渲染逻辑
- 数据处理:相同数据处理流程,不同数据源实现不同解析方式
通过合理使用多态,可以显著提升代码的可扩展性和可维护性。






