es6 class 中用 get/set 在类体内定义 getter/setter,自动绑定到原型,语法简洁且实例共享;需避免同名属性遮蔽和无限递归,常配合私有字段使用,支持读写校验、格式化与封装。

在 ES6 Class 中,用 get 和 set 关键字直接在类体内定义 getter 与 setter,它们会自动绑定到类的原型上,所有实例共享同一套访问逻辑。
怎么写:语法简洁,写在类内部
不需要手动操作 Object.defineProperty,也不用碰 prototype。只要在 class 块里按格式写即可:
- getter 写法:
get 属性名() { return ... } - setter 写法:
set 属性名(value) { ... } - 属性名不能和已有数据属性同名(否则会遮蔽,导致无限递归或静默失败)
- 通常配合私有约定字段使用,比如
this._name存值,get name()读取
为什么用:不只是“看起来像属性”,而是真有用
它们让属性访问变成可控的过程,不是简单赋值/取值:
- 读取时自动执行逻辑:比如格式化、首字母大写、计算派生值(如
fullName拼接) - 写入时做校验:比如检查类型、范围、非空,不满足就抛错,避免脏数据进实例
- 隐藏内部状态:外部用
obj.name,实际操作的是this._name,封装性更强 - 节省内存:因为定义在原型上,100 个实例共用同一个 get/set 函数,而不是各存一份
注意两个常见坑
写的时候稍不注意就会出问题:
-
别在 getter 里直接读同名属性:比如
get name() { return this.name }→ 会无限调用自己,爆栈 -
setter 参数名别叫 value 就完事:虽然常见,但建议用语义化名(如
newName),避免和其它变量混淆 - 如果只写 get 不写 set,该属性默认只读;反之只写 set,读取会返回
undefined(不报错但容易误判)
一个实用小例子
限制年龄在 0–150 之间,且读取时自动补零显示:
class Person {
constructor(name, age) {
this._name = name;
this._age = age;
}
get age() {
return this._age.toString().padStart(3, '0');
}
set age(value) {
const num = Number(value);
if (num 150 || isNaN(num)) {
throw new RangeError('Age must be a number between 0 and 150');
}
this._age = num;
}
}
这样 new Person('Alice', 5).age 返回 "005",而 p.age = -1 直接报错。











