JavaScript中父类方法重写是子类在自身构造函数或原型上定义同名方法以覆盖继承来的方法,不删除父类方法;可发生在ES6 class内部或原型对象上,重写后仍可通过super或Parent.prototype调用原方法,是运行时多态的基础。

JavaScript 中父类方法的重写(Overriding)本质是子类在自身构造函数或原型上定义同名方法,覆盖从父类原型链继承来的同名方法。它不删除父类方法,只是让子类实例优先调用自己定义的版本。
重写发生在两个主要位置
重写可以发生在类定义内部(ES6 class),也可以发生在原型对象上(函数构造器方式):
-
ES6 class 写法:在子类中直接声明同名方法,例如
say(),就会覆盖父类的say() -
原型方式写法:给
Child.prototype.say = function() {...}赋值,会覆盖从Parent.prototype继承来的say
重写后仍可调用父类原方法
重写不是删除,父类方法依然完好存在。子类中可通过以下方式显式调用:
-
ES6 class 中用
super.methodName():仅限于 class 方法体内,且必须先在 constructor 中调用super() -
原型方式中用
Parent.prototype.methodName.call(this, ...args):通用可靠,能正确绑定this并传参
重写是运行时多态的基础
不同实例调用同名方法时,实际执行哪个版本,取决于该实例的**真实类型**:
立即学习“Java免费学习笔记(深入)”;
-
new Dog().sound()→ 执行Dog.prototype.sound -
new Animal().sound()→ 执行Animal.prototype.sound -
Animal.prototype.sound()单独调用 → 仍输出原始结果,证明父类方法未被破坏
注意避免常见误区
重写不等于替换整个原型;也不影响父类其他子类的行为:
- 修改
Child.prototype.say不会影响Cat.prototype.say或Animal.prototype.say - 重写只改变“查找路径”中靠前的那一环,原型链本身未断裂
- 若想彻底禁用某方法,应明确设计为不可重写(如用
Object.defineProperty设置writable: false),但非常规做法


















