JavaScript中class的getter/setter用get/set关键字定义,不加括号,调用如普通属性;必须同名且不能与同名字段或方法共存,可配合#私有字段增强封装性。

JavaScript 中 class 的 getter 和 setter 用 get 和 set 关键字定义,写在类内部,不加括号,调用时像访问普通属性一样使用。
基本写法:get 和 set 必须成对或单独存在
getter 返回值,setter 接收一个参数(即赋值时的右值),两者名字相同,且不能与同名实例属性或方法冲突:
class Person {
constructor(name) {
this._name = name; // 通常用下划线约定私有字段
}
<p>get name() {
return this._name;
}</p><p>set name(value) {
if (typeof value === 'string' && value.trim()) {
this._name = value.trim();
} else {
throw new Error('姓名必须是非空字符串');
}
}
}</p><p>const p = new Person('Alice');
console.log(p.name); // 'Alice' —— 触发 get
p.name = ' Bob '; // 触发 set,自动 trim 后赋值为 'Bob'
console.log(p.name); // 'Bob'
只读属性:只写 get,不写 set
如果只想暴露值、禁止修改,就只定义 getter,不提供 setter。尝试赋值会静默失败(非严格模式)或报错(严格模式):
class Circle {
constructor(radius) {
this._radius = radius;
}
<p>get area() {
return Math.PI * this._radius ** 2;
}
// 没有 set area → area 是只读的
}</p><p>const c = new Circle(5);
console.log(c.area); // 约 78.54
c.area = 100; // 无效(严格模式下 TypeError)
注意:不能和同名字段/方法共存
以下写法会报错(SyntaxError):
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
立即学习“Java免费学习笔记(深入)”;
- class 内同时声明
name = 'xxx'实例字段 和get name() - class 内同时定义
name() { }方法 和get name()
解决办法是改名或统一用私有字段(如 _name)作为底层存储,通过 getter/setter 控制访问。
实际建议:配合 # 私有字段更安全(ES2022+)
用哈希前缀定义真正私有的字段,避免外部直接访问:
class BankAccount {
#balance = 0;
<p>get balance() {
return this.#balance;
}</p><p>set balance(value) {
if (value >= 0) this.#balance = value;
else throw new Error('余额不能为负');
}
}
这样 account.#balance 在类外不可访问,getter/setter 成为唯一入口,逻辑更健壮。

















