JavaScript中getter/setter应语义清晰、行为可控、避免副作用,仅用于计算、校验、拦截或兼容场景;命名与普通属性一致,不加get/set前缀;getter无参且必有确定返回值,setter单参用于校验赋值;推荐class语法集中定义,配合Symbol或下划线私有字段管理状态。

JavaScript中getter与setter的编写应遵循语义清晰、行为可控、避免副作用三大原则,不是所有属性都适合用访问器,只有在需要计算、校验、拦截或兼容旧接口时才使用。
命名需与普通属性一致,不加get/set前缀
访问器属性名应和它所代表的逻辑属性保持一致,不要写成getUserName或setAge。JS引擎会自动识别user.name触发getter,user.name = 'xxx'触发setter。
- ✅ 正确:
Object.defineProperty(obj, 'fullName', { get() { return this.first + ' ' + this.last; } }) - ❌ 错误:
getFullName——这只是一个普通方法,不是访问器
getter必须有返回值,且不能有参数
getter函数签名必须是空括号get() {},不可接受任何参数。若需传参,应改用普通方法。返回值应是确定的、无副作用的表达式结果。
- ✅ 合理:计算派生值(如
area基于width和height)、格式化输出(如isoDate) - ❌ 危险:发起网络请求、修改状态、触发DOM操作——这些会让属性读取变得不可预测
setter必须接收且仅接收一个参数,用于赋值校验与转换
setter形参名无强制要求,但建议语义化(如value、newName)。内部应对输入做必要检查,并只更新受控的内部状态(常配合私有字段或Symbol键)。
立即学习“Java免费学习笔记(深入)”;
- ✅ 推荐模式:用
Symbol或下划线前缀字段存储真实值,如this._email,getter/setter对外提供校验后的email - ✅ 示例:setter中对邮箱格式正则校验,非法值可抛错或静默忽略
- ❌ 避免:setter里调用
saveToServer()或this.render()
优先使用class语法,保持定义集中、可读性强
ES6 class中的getter/setter更简洁,且天然支持继承与重写。相比Object.defineProperty分散定义,class块内声明更易维护。
- ✅ 推荐写法:
class Person {
constructor(first, last) {
this._first = first;
this._last = last;
}
get fullName() {
return `${this._first} ${this._last}`;
}
set fullName(value) {
const parts = value.split(' ');
this._first = parts[0] || '';
this._last = parts.slice(1).join(' ') || '';
}
}
- ⚠️ 注意:class中无法直接用
defineProperty添加访问器;若需动态定义,仍需回到对象API










