多态(Polymorphism)是面向对象编程(OOP)的四大基本特性之一,其他三个分别是封装、继承和抽象。多态意味着你可以将子类的对象当作父类的对象来使用,而且在运行时会调用子类的方法。这样做的好处是提高了代码的可扩展性和复用性。
在JavaScript中,多态可以通过原型链实现。每个JavaScript对象都有一个原型(prototype),当试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会在该对象的原型上查找,如果还没有,就会继续查找原型的原型,直到找到该属性或方法或者到达原型链的末端。
// 父类
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
// 子类
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
// 子类
class Cat extends Animal {
speak() {
console.log(`${this.name} meows.`);
}
}
// 使用多态
function makeAnimalSpeak(animal) {
animal.speak();
}
const dog = new Dog('Rex');
const cat = new Cat('Whiskers');
makeAnimalSpeak(dog); // Rex barks.
makeAnimalSpeak(cat); // Whiskers meows.
在这个例子中,Dog
和 Cat
类都继承自 Animal
类,并且重写了 speak
方法。makeAnimalSpeak
函数接受一个 Animal
类型的参数,但由于多态,我们可以传入任何 Animal
的子类实例,并且在运行时会调用相应子类的 speak
方法。
super()
来调用父类的构造函数,否则会导致 this
上下文绑定错误。class
语法可以避免这类问题,因为它自动处理了原型链的设置。通过理解和正确使用多态,可以使JavaScript代码更加灵活和易于维护。
领取专属 10元无门槛券
手把手带您无忧上云