Object.prototype.__defineSetter__()

已棄用:此特性不再推薦。雖然某些瀏覽器可能仍然支援它,但它可能已經從相關的網路標準中刪除,可能正在刪除過程中,或者可能僅為相容性目的而保留。請避免使用它,如果可能,請更新現有程式碼;請參閱本頁底部的相容性表格以指導您的決策。請注意,此特性可能隨時停止工作。

注意: 此功能已棄用,建議使用 set 訪問器Object.defineProperty() API 來定義訪問器。此方法的行為僅為 Web 相容性指定,不要求在任何平臺實現。它可能並非在所有地方都可用。

__defineSetter__() 方法用於 Object 例項,它將物件的屬性繫結到一個函式,當嘗試設定該屬性時,將呼叫該函式。

語法

js
__defineSetter__(prop, func)

引數

prop

一個包含屬性名稱的字串,setter func 將繫結到該屬性。

func

嘗試設定指定屬性時要呼叫的函式。此函式接收以下引數

val

嘗試賦給 prop 的值。

返回值

無(undefined)。

異常

TypeError

如果 func 不是函式,則丟擲該錯誤。

描述

所有繼承自 Object.prototype 的物件(即除 null-prototype 物件之外的所有物件)都繼承 __defineSetter__() 方法。此方法允許在現有物件上定義一個 setter。這等同於 Object.defineProperty(obj, prop, { set: func, configurable: true, enumerable: true }),這意味著該屬性是可列舉和可配置的,並且會保留任何現有的 getter(如果存在)。

__defineSetter__() 在規範中被定義為“規範可選” (normative optional),這意味著不需要任何實現來強制實現它。然而,所有主流瀏覽器都實現了它,並且由於其持續的使用,不太可能被移除。如果瀏覽器實現了 __defineSetter__(),它還需要實現 __lookupGetter__()__lookupSetter__()__defineGetter__() 方法。

示例

使用 __defineSetter__()

js
const o = {};
o.__defineSetter__("value", function (val) {
  this.anotherValue = val;
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

以標準方式定義 setter 屬性

您可以在物件首次初始化時使用 set 語法來定義 setter。

js
const o = {
  set value(val) {
    this.anotherValue = val;
  },
};
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

您也可以在物件建立後使用 Object.defineProperty() 在物件上定義 setter。與 __defineSetter__() 相比,此方法允許您控制 setter 的可列舉性和可配置性,以及定義 symbol 屬性。Object.defineProperty() 方法也適用於 null-prototype 物件,這些物件不繼承自 Object.prototype,因此沒有 __defineSetter__() 方法。

js
const o = {};
Object.defineProperty(o, "value", {
  set(val) {
    this.anotherValue = val;
  },
  configurable: true,
  enumerable: true,
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

規範

規範
ECMAScript® 2026 語言規範
# sec-object.prototype.__defineSetter__

瀏覽器相容性

另見