es6 class继承中重写父类方法只需在子类定义同名方法,通过原型链就近查找自动覆盖;需复用父逻辑时用super调用;重写getter/setter须用对应语法;避免直接赋值prototype破坏继承链。

在 ES6 的 class 继承中,重写父类方法就是直接在子类中定义一个同名方法——它会自动覆盖(更准确说是“遮蔽”)父类原型上的同名方法,这是 JavaScript 原型链的就近查找机制决定的。
用 class 语法直接定义同名方法
这是最常用、最清晰的方式。只要子类中声明了与父类相同名称的实例方法,调用时就会执行子类版本:
- 父类方法在
Parent.prototype上,子类方法在Child.prototype上 - 实例调用时,引擎先查子类原型,命中即执行,不会继续向上找父类
- 无需额外操作,也不影响未被重写的方法(如父类其他方法仍可正常使用)
示例:
class Parent {greet() { return "Hello"; }
}
class Child extends Parent {
greet() { return "Hi there!"; } // ✅ 直接重写
}
new Child().greet(); // 输出 "Hi there!"
需要调用父类逻辑时用 super
如果子类方法想复用或增强父类行为(比如修改参数、加日志、做前置/后置处理),必须用 super.方法名() 显式调用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
super只能在子类的普通方法(非箭头函数)和构造函数中使用 - 不能在箭头函数里用
super,否则报错 - 调用
super.method()时,this仍指向当前子类实例
示例:
class Child extends Parent {greet() {
console.log("Before greeting");
const result = super.greet() + " ?";
console.log("After greeting");
return result;
}
}
重写 getter/setter 要单独定义
如果父类用 get 或 set 定义了访问器属性,子类不能靠简单赋值覆盖,必须也用 get/set 语法重新声明:
- 写
this.prop = xxx或Child.prototype.prop = xxx不生效,可能触发父类 setter 或创建数据属性 - 正确做法是在子类中显式写出
get prop() { ... }或set prop(v) { ... }
示例:
class Parent {get value() { return "parent"; }
}
class Child extends Parent {
get value() { return "child"; } // ✅ 正确覆盖
set value(v) { console.log("set to", v); }
}
避免破坏继承链的错误写法
重写方法本身不会断链,但若操作不当(比如重设整个 prototype),会导致子类丢失对父类方法的访问:
- ❌ 错误:
Child.prototype = { greet() { ... } };—— 这会切断__proto__指向,父类方法全失效 - ✅ 正确:始终用
extends声明继承,并在子类class体内添加方法,或用Object.defineProperty扩展已有原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










