javascript通过原型重写实现多态:子类原型继承父类原型后重定义同名方法,使同一方法名在不同实例上调用执行不同逻辑,运行时依据实际对象原型决定行为。

JS 原型对象本身不支持“重载”,但可以通过**方法重写(override)**配合原型链机制,实现典型的多态效果:同一方法名,在不同对象实例上调用时执行不同逻辑。
重写原型方法的基本步骤
核心是让子类的原型对象继承父类原型,并在子类原型上定义同名方法——该方法会覆盖(而非重载)父类原型中的同名方法。
- 先让子类原型指向父类的一个实例(或用
Object.create(Parent.prototype)) - 手动设置子类原型的
constructor指回自身,避免丢失构造器引用 - 在子类原型上重新赋值同名方法,即完成重写
典型代码示例(ES5 风格)
以下代码展示了如何通过原型重写实现多态:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' 发出声音');
};
function Dog(name, breed) {
Animal.call(this, name); // 继承实例属性
this.breed = breed;
}
// 关键:建立原型链继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// ✅ 重写 speak 方法 → 实现多态分支
Dog.prototype.speak = function() {
console.log(this.name + ' 汪汪叫!品种:' + this.breed);
};
const a = new Animal('小动物');
const d = new Dog('旺财', '金毛');
a.speak(); // 输出:小动物 发出声音
d.speak(); // 输出:旺财 汪汪叫!品种:金毛
为什么这算多态?
关键在于调用方无需知道具体类型,只认方法名。例如统一处理函数:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
function makeItSpeak(animalObj) {
animalObj.speak(); // 同一个调用,行为由实际对象决定
}
makeItSpeak(a); // 小动物 发出声音
makeItSpeak(d); // 旺财 汪汪叫!品种:金毛
这种“一个接口、多种实现”的行为,正是多态的本质体现。
ES6 class 写法更清晰
使用 class 和 extends 是语法糖,底层仍是原型操作,但语义更明确:
class Animal {
constructor(name) { this.name = name; }
speak() { console.log(this.name + ' 发出声音'); }
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() { console.log(this.name + ' 汪汪叫!品种:' + this.breed); }
}
子类中直接定义同名方法即自动覆盖父类方法,super.speak() 可显式调用父级实现。
多态不依赖编译期类型检查,而靠运行时对象的实际原型结构决定行为——这是 JavaScript 动态特性的自然体现。










