试一试
const language = {
set current(name) {
this.log.push(name);
},
log: [],
};
language.current = "EN";
language.current = "FA";
console.log(language.log);
// Expected output: Array ["EN", "FA"]
语法
js
{ set prop(val) { /* … */ } }
{ set [expression](val) { /* … */ } }
还有一些额外的语法限制
- setter 必须且只能有一个参数。
参数
描述
在 JavaScript 中,每当尝试更改属性的值时,都可以使用 setter 来执行函数。setter 最常与 getter 结合使用。
对象属性要么是数据属性,要么是访问器属性,但不能同时是两者。更多信息请阅读 Object.defineProperty()。setter 语法允许你在对象初始化器中指定 setter 函数。
js
const obj = {
set prop() {
// setter, the code executed when setting obj.prop
},
}
使用此语法定义的属性是创建对象的自身属性,并且它们是可配置和可枚举的。
示例
在对象初始化器中的新对象上定义 setter
以下示例定义了对象 language 的伪属性 current。当为 current 赋值时,它会使用该值更新 log
js
const language = {
set current(name) {
this.log.push(name);
},
log: [],
};
language.current = "EN";
console.log(language.log); // ['EN']
language.current = "FA";
console.log(language.log); // ['EN', 'FA']
请注意,current 未定义,任何访问它的尝试都将导致 undefined。
在类中使用 setter
你可以使用完全相同的语法来定义在类实例上可用的公共实例 setter。在类中,方法之间不需要逗号分隔符。
js
class ClassWithGetSet {
#msg = "hello world";
get msg() {
return this.#msg;
}
set msg(x) {
this.#msg = `hello ${x}`;
}
}
const instance = new ClassWithGetSet();
console.log(instance.msg); // "hello world"
instance.msg = "cake";
console.log(instance.msg); // "hello cake"
setter 属性定义在类的 prototype 属性上,因此由类的所有实例共享。与对象字面量中的 setter 属性不同,类中的 setter 属性不可枚举。
使用 delete 运算符删除 setter
如果你想删除 setter,只需 删除 它即可
js
delete language.current;
使用 defineProperty 在现有对象上定义 setter
要将 setter 附加到现有对象,请使用 Object.defineProperty()。
js
const o = { a: 0 };
Object.defineProperty(o, "b", {
set(x) {
this.a = x / 2;
},
});
o.b = 10;
// Runs the setter, which assigns 10 / 2 (5) to the 'a' property
console.log(o.a); // 5
使用计算属性名
js
const expr = "foo";
const obj = {
baz: "bar",
set [expr](v) {
this.baz = v;
},
};
console.log(obj.baz); // "bar"
obj.foo = "baz";
// Run the setter
console.log(obj.baz); // "baz"
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-method-definitions |
浏览器兼容性
加载中…
另见
- 使用对象指南
- 函数
getObject.defineProperty()- 对象初始化器
class- 属性访问器
- 不兼容的 ES5 变更:字面量 getter 和 setter 函数现在必须恰好有零个或一个参数,作者:Jeff Walden (2010)
- 更多 SpiderMonkey 变更:创建 getter 和 setter 的古老、深奥、极少使用的语法正在被移除,作者:Jeff Walden (2010)