getter 和 setter 使属性访问自动触发函数逻辑,读写操作分别调用 get/set 方法,实现封装与校验;可在对象字面量或 class 中定义,配合私有字段隐藏内部实现。

JavaScript 中的 Getter 和 Setter 可以让对象的某个“属性”在被读取或赋值时,自动触发函数逻辑,而调用方完全感知不到背后是函数——就像访问普通属性一样自然。
用 get 和 set 关键字定义访问器属性
在对象字面量或类中,使用 get 和 set 语法声明的属性不会存储实际值,而是绑定到对应的函数。外部代码对它的读写操作会被重定向到这些函数:
- 读取
obj.name→ 自动执行get name()函数,返回其结果 - 赋值
obj.name = "Alice"→ 自动执行set name(value)函数,value就是等号右边的值
在对象字面量中直接定义
适合简单场景,无需构造函数也能实现属性级封装:
const user = {
_name: 'John',
get name() {
console.log('Getter triggered');
return this._name;
},
set name(value) {
console.log('Setter triggered with:', value);
if (typeof value === 'string' && value.trim()) {
this._name = value.trim();
}
}
};
console.log(user.name); // 输出:Getter triggered → "John"
user.name = ' Alice '; // 输出:Setter triggered with: " Alice "
console.log(user.name); // 输出:Getter triggered → "Alice"
在 class 中定义更清晰的封装逻辑
推荐用于需要状态管理、校验或副作用的场景,私有字段(如 #age)配合 getter/setter 能更好隐藏内部实现:
class Person {
#age = 0;
get age() {
return this.#age;
}
set age(value) {
if (Number.isInteger(value) && value >= 0 && value
<h3>用 <strong>Object.defineProperty</strong> 动态添加访问器属性</h3>
<p>适用于已有对象,或需精确控制属性特性(如是否可枚举、可配置):</p>
<pre class="brush:php;toolbar:false;">const obj = {};
Object.defineProperty(obj, 'timestamp', {
get() {
return Date.now();
},
set(value) {
console.warn('timestamp is read-only');
},
enumerable: true,
configurable: false
});
console.log(obj.timestamp); // 每次读取都返回当前毫秒数
obj.timestamp = 123; // 执行 setter,但不改变任何状态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











