getter/setter 必须定义在 class 花括号内,作为类结构的一部分;需搭配私有存储字段(如 _name 或 #name)避免递归;可与 constructor 等共存,支持继承、super 调用,默认 configurable,但应成对定义以确保逻辑完整。

getter/setter 必须定义在 class 关键字后的花括号内,也就是类体(class body)中。
只能写在类体内,不能写在外部
类的 getter/setter 是类结构的一部分,必须直接出现在 class ClassName { ... } 的大括号内部。写在类外面、函数里、或用 prototype 手动添加,都不属于“类语法定义”,会失去 class 语义和继承行为的一致性。
- ✅ 正确:在 class 内部用
get name() { ... }和set name(v) { ... } - ❌ 错误:在 class 外写
Person.prototype.get name = function() { ... }; - ❌ 错误:在 constructor 里给
this赋值函数,比如this.get name = ...
需搭配私有存储字段,避免命名冲突
类中定义 get name() 时,不能再用 this.name 存原始值,否则会无限递归调用自己。惯例是用下划线前缀(如 this._name)或私有字段(#name)做底层存储。
- 推荐用
this._name:简单兼容,适合多数场景 - 推荐用
#name:真正私有,但注意 setter/getter 内部也得用#name访问 - 不要混用:比如 getter 读
this._name,setter 却写this.name
可以与 constructor、普通方法共存于同一类体
getter/setter 和其他类成员一样,共享同一个作用域,能访问 this、调用其他实例方法、使用 super,也能被子类继承或覆盖。
立即学习“Java免费学习笔记(深入)”;
- 子类若只定义
set name(),未定义get name(),则读取该属性会返回undefined - 子类中可通过
super.name显式调用父类的 getter/setter - 类体中定义的 getter/setter 默认
configurable: true,支持后续重定义
不支持只写 get 或只写 set 的“半访问器”
语法上允许单独写一个,但逻辑上不完整:只定义 setter 没 getter,读属性会得 undefined;只定义 getter 没 setter,赋值会静默失败(非严格模式)或报错(严格模式)。
- 实际开发中,成对定义更安全,除非明确只需要只读或只写语义
- 若只需只读,就只写
get,并确保不意外赋值 - 若需拦截赋值但不暴露读取逻辑,可用普通方法替代,而非残缺的 setter


















