重写父类属性应保持行为可预期:确保类型用途一致、super()后赋值、用getter/setter校验类型、避免遮蔽原型访问器。

重写父类属性时保持数据类型一致,关键不是“能不能改”,而是“改完之后行为是否可预期”。JavaScript 中属性本身没有类型声明,所谓“类型一致性”实际体现在值的使用方式、方法调用链、以及外部代码对它的假设上。只要子类重写的属性在读取、赋值、参与运算或被方法消费时,不破坏原有契约,就视为类型安全。
明确属性用途,避免隐式类型切换
父类中定义的属性往往承载特定语义,比如 id 是字符串标识符、items 是数组、enabled 是布尔值。子类重写时若擅自改成其他类型,下游逻辑极易崩溃。
- ❌ 错误示例:父类
this.items = [],子类却写this.items = new Set()—— 外部代码调用items.push()就会报错 - ✅ 正确做法:保持底层结构兼容,如仍用数组,但内部增强:
this.items = []; this.addItem = (item) => { /* 带去重逻辑 */ }; - 若必须换结构(如改用 Map),应同时重写所有依赖该属性的方法,并确保公开接口行为不变(比如仍提供
getItems()返回数组)
重写实例属性时,务必在 super() 后赋值
子类构造函数中若要覆盖父类初始化的属性,必须等 super() 执行完毕再操作 this,否则可能访问未定义的上下文,导致赋值失败或类型混乱。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 父类
constructor(name) { this.name = name; }中name是字符串 - 子类应这样写:
constructor(name) { super(name); this.name = name.trim(); }—— 仍是字符串,只是做了清理 - ⚠️ 禁止在
super()前给this赋值,否则报错;也禁止跳过super()直接重写属性
用 getter/setter 控制类型约束
直接暴露可写属性容易失控。用访问器封装,可在赋值时做类型校验和归一化,比单纯“重写属性值”更可靠。
立即学习“Java免费学习笔记(深入)”;
- 父类定义
this.count = 0;(数字) - 子类可改为:
set count(val) { this._count = Number(val); } get count() { return this._count; } - 这样即使传入
"5"或null,最终count仍是数字,外部调用逻辑不受影响 - 配合
Object.defineProperty可设为不可枚举,避免被遍历或序列化干扰
警惕原型上同名属性覆盖实例属性
如果父类在原型上定义了 get label(),而子类在实例上直接写 this.label = "text",就会遮蔽 getter,导致类型语义断裂(比如原本是计算属性,现在变成静态字符串)。
- 检查父类定义方式:是
this.xxx = ...(实例属性),还是get xxx()(访问器),或是仅在原型方法中使用 - 子类重写应匹配层级:父类实例属性 → 子类也用实例赋值;父类是 getter → 子类重写 getter,而非直接挂实例值
- 可用
Object.getOwnPropertyDescriptor(obj, 'prop')检查属性来源,避免意外遮蔽

















