JavaScript 的 class 可用 get/set 定义访问器属性:get 拦截读取,实现只读计算属性,不接受参数;set 拦截赋值,接收一个参数用于校验或转换,须配合私有字段使用。

JavaScript 中的 class 可以用 get 和 set 关键字定义访问器属性(accessor properties),从而在读取或赋值时插入自定义逻辑,实现对属性存取的拦截和控制。
用 get 拦截属性读取
get 定义一个只读式访问器,当访问该属性时自动执行函数体,返回值即为属性值。它不接受参数,不能有 return 以外的语句(如 return 后跟表达式)。
- 适合做计算属性、格式化输出、权限检查或懒加载
- 不能与同名数据属性共存(会报错)
- 调用时不加括号,像普通属性一样使用
例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
class Person {
constructor(name, age) {
this._name = name;
this._age = age;
}
get name() {
console.log('正在读取 name');
return this._name.toUpperCase();
}
}
const p = new Person('alice', 25);
console.log(p.name); // 输出:正在读取 name → "ALICE"
用 set 拦截属性赋值
set 定义一个写入式访问器,当给该属性赋值时触发,接收一个参数(即赋的值),可用于校验、转换、同步更新其他状态等。
立即学习“Java免费学习笔记(深入)”;
- 必须有且仅有一个形参,否则语法错误
- 不能与同名数据属性共存
- 通常配合私有字段(如
_xxx)存储真实值
例如:
class Temperature {
constructor(celsius) {
this._celsius = celsius;
}
get fahrenheit() {
return (this._celsius * 9 / 5) + 32;
}
set fahrenheit(value) {
if (typeof value !== 'number' || value < -459.67) {
throw new Error('温度不能低于绝对零度(华氏)');
}
this._celsius = (value - 32) * 5 / 9;
}
}
const t = new Temperature(0);
console.log(t.fahrenheit); // 32
t.fahrenheit = 212;
console.log(t._celsius); // 100
get 和 set 配合实现受控属性
常见模式是成对定义同一个属性名的 get 和 set,通过私有字段中转,把业务逻辑封装在访问器内部。
- 避免直接暴露原始字段,提升封装性
- 可统一处理边界值、类型转换、副作用(如触发事件、更新 DOM)
- 注意不要在
get或set中直接读/写同名访问器,否则导致无限递归
错误示例(递归崩溃):
get name() {
return this.name; // ❌ 不要这样!
}
正确做法是读写带下划线的后备字段:this._name。
注意点和限制
访问器属性本质是对象的属性描述符(descriptor),在 class 中声明时有一些隐含规则:
- 不能在实例上动态添加
get/set(需在 class 定义中声明) - 不能用箭头函数定义访问器(语法不允许)
- 若只定义
get不定义set,该属性为只读;反之只定义set则读取时返回undefined - 可通过
Object.getOwnPropertyDescriptor查看其 descriptor 类型(get、set、configurable、enumerable)
不复杂但容易忽略。

















