get和set用于定义访问器属性,控制读写行为;get无参返回值,set单参无返回;常配合私有字段实现封装与校验,且不可枚举。

在 JavaScript 的 class 中,get 和 set 关键字用于定义访问器属性(accessor properties),也就是“计算属性”——它们不直接存储值,而是通过函数控制读取(get)和赋值(set)行为。
基本语法:get 和 set 成对或单独使用
一个访问器属性由 get 方法(读取时触发)和/或 set 方法(赋值时触发)组成,写在 class 内部,**不能带括号,也不能有参数(除了 set 的唯一参数)**:
-
get方法必须无参,返回值即为属性的读取结果; -
set方法有且仅有一个参数(即等号右边的值),无返回要求; - 二者可只定义其中一个(比如只读用
get,只写则极少用,一般不推荐); - 不能与同名的数据属性(如
this._name)或其它访问器共存于同一 class 实例上(会报错)。
典型用法:封装私有数据 + 数据校验/转换
通常配合私有字段(如 _age)使用,实现受控访问。例如:
class Person {
constructor(name, age) {
this._name = name;
this._age = age;
}
<p>get name() {
return this._name.trim(); // 读取时自动去空格
}</p><p>set name(value) {
if (typeof value !== 'string' || value.trim() === '') {
throw new Error('姓名必须是非空字符串');
}
this._name = value.trim();
}</p><p>get age() {
return this._age;
}</p><p>set age(value) {
if (!Number.isInteger(value) || value < 0 || value > 150) {
throw new Error('年龄必须是 0–150 之间的整数');
}
this._age = value;
}
}使用时就像普通属性一样:
const p = new Person(' Alice ', 25);
console.log(p.name); // 'Alice'(自动 trim)
p.name = ' Bob ';
console.log(p.name); // 'Bob'
p.age = 30; // ✅
p.age = -5; // ❌ 抛出错误注意事项:不能混用 var/let/const 声明,也不可枚举
访问器属性默认是 不可枚举(`enumerable: false`),所以 for...in 或 Object.keys() 不会列出它。若需检查是否为访问器,可用:
Object.getOwnPropertyDescriptor(Person.prototype, 'name');
结果中会包含 get 和/或 set 字段。另外:
- 不要在 class 中用 let name 或 const age 声明同名变量,那属于块级作用域,和实例属性无关;
- 访问器内部不要直接读写同名访问器(如 get name 里写 this.name),否则会无限递归调用。
搭配 # 私有字段(ES2022+)更安全
为避免外部意外修改底层数据,推荐用私有字段(#前缀)替代 _ 命名约定:
class Person {
#name;
#age;
<p>constructor(name, age) {
this.#name = name;
this.#age = age;
}</p><p>get name() { return this.#name.trim(); }
set name(value) { /<em> 同上校验逻辑 </em>/ this.#name = value.trim(); }</p><p>get age() { return this.#age; }
set age(value) { /<em> 校验后赋值 </em>/ this.#age = value; }
}这样 p.#name 在类外部完全不可访问,封装性更强。


















