Object.prototype.__lookupSetter__()

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

注意: 此功能已棄用,請改用 Object.getOwnPropertyDescriptor() API。此方法的行為僅為相容 Web 而指定,平臺可以不實現。它可能無法在所有地方正常工作。

__lookupSetter__() 方法是 Object 例項上用於返回繫結到指定屬性的 setter 函式的方法。

語法

js
__lookupSetter__(prop)

引數

prop

一個包含要返回其 setter 的屬性名稱的字串。

返回值

繫結到指定屬性的 setter 函式。如果未找到該屬性,或者該屬性是 資料屬性,則返回 undefined

描述

所有繼承自 Object.prototype 的物件(即除 null-prototype 物件之外的所有物件)都繼承 __lookupSetter__() 方法。如果已為物件的屬性定義了 setter,則無法透過該屬性引用 setter 函式,因為該屬性僅在設定該屬性時呼叫函式。__lookupSetter__() 可用於獲取對 setter 函式的引用。

__lookupSetter__() 會遍歷 原型鏈 以查詢指定的屬性。如果原型鏈上的任何物件擁有指定的 自有屬性,則返回該屬性的 屬性描述符set 屬性。如果該屬性是資料屬性,則返回 undefined。如果沿著整個原型鏈都找不到該屬性,也返回 undefined

__lookupSetter__() 在規範中被定義為“規範可選”,這意味著沒有實現要求必須實現它。然而,所有主流瀏覽器都實現了它,並且由於它的持續使用,不太可能被移除。如果瀏覽器實現了 __lookupSetter__(),那麼它也需要實現 __lookupGetter__()__defineGetter__()__defineSetter__() 方法。

示例

使用 __lookupSetter__()

js
const obj = {
  set foo(value) {
    this.bar = value;
  },
};

obj.__lookupSetter__("foo");
// [Function: set foo]

以標準方式查詢屬性的 setter

您應該使用 Object.getOwnPropertyDescriptor() API 來查詢屬性的 setter。與 __lookupSetter__() 相比,此方法允許查詢 Symbol 屬性。Object.getOwnPropertyDescriptor() 方法也適用於 null-prototype 物件,這些物件不繼承自 Object.prototype,因此沒有 __lookupSetter__() 方法。如果 __lookupSetter__() 遍歷原型鏈的行為很重要,您可以使用 Object.getPrototypeOf() 自己實現。

js
const obj = {
  set foo(value) {
    this.bar = value;
  },
};

Object.getOwnPropertyDescriptor(obj, "foo").set;
// [Function: set foo]
js
const obj2 = {
  __proto__: {
    set foo(value) {
      this.bar = value;
    },
  },
};

function findSetter(obj, prop) {
  while (obj) {
    const desc = Object.getOwnPropertyDescriptor(obj, prop);
    if (desc) {
      return desc.set;
    }
    obj = Object.getPrototypeOf(obj);
  }
}

console.log(findSetter(obj2, "foo")); // [Function: set foo]

規範

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

瀏覽器相容性

另見