JavaScript子类可重写父类getter/setter:同名声明即覆盖,不自动继承;需用super调用父类逻辑;只重写其一,另一仍走父类;避免this赋值导致递归;静态访问器同理;推荐抽离核心逻辑为普通方法以增强可维护性。

在 JavaScript 中,子类可以通过 class 语法继承父类,并在子类中重新定义(即重写)父类的 getter 和 setter。关键在于:子类中直接用同名的 get 和 set 声明即可覆盖父类对应访问器,无需特殊关键字;如需在子类访问器中调用父类逻辑,可使用 super。
重写 getter/setter 的基本写法
只要子类中声明了与父类同名的 get 或 set,就会完全替换父类定义,不自动继承。这是“覆盖”而非“增强”。
- 子类中写
get propName() { ... }→ 覆盖父类的get propName - 子类中写
set propName(value) { ... }→ 覆盖父类的set propName - 若只重写其中一个(比如只重写
get),另一个仍为父类原始行为(除非也被显式重写)
用 super 调用父类的 getter/setter
如果想在子类访问器中复用父类逻辑(例如做额外校验或包装),可用 super.propName 读取或赋值——注意:super.propName 在 get 中触发父类 get,在 set 中触发父类 set。
示例:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
class Parent {
constructor(value) {
this._value = value;
}
get value() {
return this._value;
}
set value(v) {
this._value = v;
}
}
class Child extends Parent {
get value() {
console.log('Child getting value');
return super.value.toUpperCase(); // 调用父类 getter 并处理
}
set value(v) {
console.log('Child setting value');
if (typeof v === 'string') {
super.value = v.trim(); // 调用父类 setter
}
}
}
const c = new Child(' hello ');
console.log(c.value); // 输出:'Child getting value' → 'HELLO'
c.value = ' world '; // 输出:'Child setting value'
console.log(c.value); // 'WORLD'
注意事项和常见陷阱
- 不能只声明 getter 或 setter 之一而期望另一个自动保留“继承链”:ES6 class 不支持“部分继承”访问器。未重写的那个仍走父类逻辑,但这是默认行为,不是“继承而来”的新方法
-
避免在 setter 中直接赋值给同名属性(如
this.value = v),否则会无限递归调用自身 setter;应操作私有字段(如this._value)或通过super.value = v -
静态 getter/setter 也可被重写,写法相同,但要用
static get/static set,且super指向父类构造函数 - 若父类 getter/setter 依赖私有字段(如
#value),子类无法直接访问该私有字段,必须通过super间接操作
替代方案:不重写,而是扩展行为
如果只是想“增强”而非“替换”,可在父类中预留钩子,或把核心逻辑抽成普通方法供子类复用:
class Parent {
get value() {
return this._getValue();
}
set value(v) {
this._setValue(v);
}
_getValue() { return this._value; }
_setValue(v) { this._value = v; }
}
class Child extends Parent {
_getValue() {
return super._getValue()?.toUpperCase() || '';
}
_setValue(v) {
super._setValue(typeof v === 'string' ? v.trim() : v);
}
}
这种方式更利于组合与测试,也规避了访问器覆盖带来的隐式行为变化。

















