試一試
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)