在 javascript 中,多态主要通过原型链继承和组合模式实现,核心在于子类重写父类的方法,使得调用同一接口时能执行不同的具体逻辑。开发者只需定义一个包含通用方法的基类,让子类继承该基类并覆盖特定方法,即可在统一调用时获得不同行为。这种机制依赖于动态类型检查和原型查找,无需显式声明接口。

如何通过原型链实现方法重写
通过原型链实现多态的关键是让子类构造函数的原型指向父类实例,从而共享基础方法。当子类需要特定行为时,直接在子类原型上定义同名方法,这会屏蔽父类原型上的对应方法。调用时,JavaScript 引擎会沿着原型链向上查找,找到最近定义的版本执行。这种方式简单直接,适合大多数面向对象场景。

class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
class Cat extends Animal {
constructor(name) {
super(name);
}
speak() {
console.log(`${this.name} meows.`);
}
}
const animals = [new Dog('Rex', 'Labrador'), new Cat('Whiskers')];
animals.forEach(animal => animal.speak());
运行上述代码将输出:
Rex barks.
Whiskers meows.
组合模式如何替代继承实现多态
组合模式通过将对象组合成树形结构来表示部分-整体关系,从而实现多态。与继承不同,组合不依赖类层次结构,而是通过委托给内部组件来实现行为。开发者可以定义一个上下文对象,它持有多个策略或组件的引用,并根据运行时状态调用这些组件的方法。这种方式更加灵活,避免了深层继承带来的耦合问题。

class Engine {
start() {
return 'Engine started.';
}
}
class ElectricEngine extends Engine {
start() {
return 'Electric engine hummed to life.';
}
}
class Car {
constructor(engine) {
this.engine = engine;
}
drive() {
return this.engine.start();
}
}
const car1 = new Car(new Engine());
const car2 = new Car(new ElectricEngine());
console.log(car1.drive());
console.log(car2.drive());
运行上述代码将输出:
Engine started.
Electric engine hummed to life.
当子类未重写父类方法时会发生什么
如果子类没有重写父类的方法,调用该方法时会执行父类中定义的原版逻辑。这是因为原型链查找机制会在子类原型上找不到对应方法后,继续向父类原型查找。这种行为确保了即使子类扩展了功能,未修改的部分仍保持原有特性。开发者可以利用这一点来减少重复代码,只重写需要变化的部分。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











