JavaScript class 中用 get/set 定义访问器可实现属性的受控访问,封装私有字段(如 #celsius)并校验、转换或同步值,避免递归赋值,且访问器不可枚举。

JavaScript class 中用 get 和 set 定义访问器(accessor properties),能让你在读取或赋值时插入逻辑,实现对属性的受控访问——它不改变属性名的表面用法,却把底层操作完全掌握在自己手里。
用 get/set 封装内部状态
把真实数据存在私有字段(# 开头)或带下划线的约定字段(如 _value)里,再通过 getter/setter 暴露“门面”:
-
get方法在读取属性时自动触发,适合返回计算值、格式化结果或只读代理 -
set方法在赋值时运行,可用于校验、转换、触发副作用(比如更新 UI 或日志) - 访问器属性本身不可枚举,不会出现在
for...in或Object.keys()中
配合私有字段实现真正封装
推荐组合 # 私有字段 + get/set,既语法安全又语义清晰:
- 私有字段(如
#email)确保外部无法绕过逻辑直接修改 - getter 可做格式统一(如转小写、加域名),setter 可做邮箱校验、去空格等
- 避免在 setter 里直接改
this.email,否则会无限递归;必须操作私有字段或带下划线的后备字段
常见写法与注意事项
访问器定义在 class body 内,和普通方法并列,但不用 function 关键字:
- 不能同时声明同名的数据属性和访问器属性(会报错)
- getter 必须有返回值,setter 参数名可自定义(常用
value) - 若只定义 getter,该属性就是只读的;只定义 setter 则只能赋值、无法读取(实际极少用)
- 访问器中可调用其他私有方法(
this.#validate()),也能访问this上的其他属性
实用示例:带验证的温度类
下面这个类把摄氏温度存为私有字段,通过访问器控制读写,并自动同步华氏值:
class Temperature {#celsius = 0;
get celsius() {
return this.#celsius;
}
set celsius(value) {
if (typeof value !== 'number' || value throw new Error('Invalid temperature: below absolute zero');
}
this.#celsius = value;
}
get fahrenheit() {
return (this.#celsius * 9) / 5 + 32;
}
}


















