set

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

set 語法將物件屬性繫結到在嘗試設定該屬性時要呼叫的函式。它也可以在中使用。

試一試

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 必須且只能有一個引數。

引數

prop

要繫結到給定函式的屬性的名稱。與物件初始化器中的其他屬性一樣,它可以是字串字面量、數字字面量或識別符號。

val

儲存嘗試賦值給 prop 的值的變數的別名。

表示式

你也可以使用表示式來計算屬性名稱,然後將其繫結到給定函式。

描述

在 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 屬性不可列舉。

靜態 setter 和私有 setter 使用類似的語法,這些語法在 static私有元素 頁面中進行了描述。

使用 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

瀏覽器相容性

另見