javascript类中getter/setter不是语法糖,而是定义在类体内的关键机制,需配对私有字段避免递归,用于校验、格式化、计算和副作用等属性访问逻辑。

JavaScript 类中 getter 和 setter 不是语法糖,而是控制属性行为的关键机制。它们让属性访问变成可编程的过程,而不是简单的读写内存值。
必须写在 class 内部,不能脱离类体
getter/setter 只能定义在 class ClassName { } 的花括号里,属于类结构的一部分。写在外部、构造函数里、或用 prototype 手动添加,都不算“类语法定义”,会丢失继承一致性、super 调用能力,也不参与类的语义解析。
- ✅ 正确:直接在类体内写
get name() { return this._name; } - ❌ 错误:在 class 外写
Person.prototype.get name = ... - ❌ 错误:在
constructor中给this.name赋一个函数
必须搭配私有存储字段,避免递归或遮蔽
如果在 get name() 里直接返回 this.name,就会无限调用自己,导致栈溢出。同理,set name(v) 里若写 this.name = v,也会触发自身。
- 推荐用下划线前缀:如
this._name存原始值,getter 读它,setter 写它 - 也可用私有字段
#name,但 getter/setter 内部也得用this.#name访问 - 不要混用:比如 getter 读
this._name,setter 却写this.name
成对定义更安全,逻辑才完整
语法允许只写 get 或只写 set,但实际开发中容易出问题:
- 只定义 setter,读属性会返回
undefined(不报错但难排查) - 只定义 getter,赋值操作在非严格模式下静默失败,严格模式下直接报错
- 若明确只需只读(如
fullName),就只写 get,并确保外部不尝试赋值 - 若只需拦截写入但不暴露读取逻辑,建议用普通方法替代,而非残缺的 setter
利用它们做真正有用的事
它们的价值不在“看起来像属性”,而在于把校验、格式化、副作用等逻辑自然地嵌入属性访问流程中:
- 写入时校验:比如限制 age 必须是 0–150 的数字,否则抛错
- 读取时转换:比如返回
this._age.toString().padStart(3, '0') - 计算派生值:如
get fullName() { return `${this._first} ${this._last}`; } - 触发副作用:比如修改
status时自动更新lastModified时间戳
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











