javascript中方法重写生效的核心机制是原型链查找与同名覆盖,依赖继承关系和就近原则:子类原型上定义同名方法即覆盖父类,运行时动态解析;重写后可通过super或parent.prototype调用父类方法,父类方法本身未被删除。

JS 中方法重写(Overriding)生效的核心机制是“**原型链查找 + 同名覆盖**”,本质不是编译时绑定,而是运行时动态解析。只要子类原型(或实例)上存在与父类同名的方法,调用时就会优先使用子类的版本——这是 JavaScript 原型继承天然支持的行为。
重写生效的前提:必须有继承关系
只有通过 extends(ES6 Class)或手动设置原型链(如 Child.prototype = Object.create(Parent.prototype)),子类才能访问父类方法;否则谈不上“重写”,只是定义了一个独立方法。
- ES6 方式:子类必须用
extends显式继承父类 - 原型方式:子类原型必须指向父类原型链上的某个对象(通常是
Parent.prototype或其实例)
重写生效的关键:就近原则(Prototype Lookup Order)
当调用 obj.method() 时,JS 引擎按以下顺序查找:
- 先查
obj自身属性(包括实例上直接定义的方法) - 再查
obj.__proto__(即构造函数的prototype) - 然后沿
__proto__链向上,直到找到该方法或到达null
因此,只要子类的 prototype 上定义了同名方法,它就自然“挡住”了父类原型上的同名方法——无需关键字、无需声明,覆盖即生效。
重写后如何调用父类原方法?
子类重写后,仍可通过 super.methodName()(ES6 Class)或 Parent.prototype.methodName.call(this)(原型方式)显式调用父类实现。
-
super只在 class 内部、方法中可用,且必须在constructor中先调用super() - 原型方式中,
Parent.prototype.methodName.call(this, ...args)是通用、可靠的方式,能正确绑定this并传参
注意:重写不等于删除,父类方法依然存在
重写只是让子类实例“看不见”父类方法,但父类原型上的方法未被修改或删除。例如:
class Animal { sound() { console.log("animal"); } }
class Dog extends Animal { sound() { console.log("woof"); } }
const d = new Dog();
d.sound(); // "woof"
Animal.prototype.sound(); // "animal" —— 父类方法完好无损
这也说明:重写是运行时多态的基础,不同实例调用同名方法,行为由其实际类型决定。











