Object.prototype.__lookupSetter__()

已弃用:此功能不再推荐。尽管一些浏览器可能仍然支持它,但它可能已从相关的 Web 标准中删除,可能正在被删除,或者可能仅出于兼容性目的而保留。避免使用它,并尽可能更新现有代码;请参阅此页面底部的兼容性表,以指导您的决策。请注意,此功能可能随时停止工作。

注意:此功能已被弃用,取而代之的是Object.getOwnPropertyDescriptor() API。此方法的行为仅针对 Web 兼容性指定,并且不需要在任何平台上实现。它可能并非在所有地方都能正常工作。

__lookupSetter__()Object 实例的方法,它返回绑定到指定属性的设置器函数。

语法

js
__lookupSetter__(prop)

参数

prop

包含应返回其设置器的属性名称的字符串。

返回值

绑定到指定属性的设置器函数。如果未找到此类属性,或者该属性是数据属性,则返回undefined

描述

所有继承自Object.prototype的对象(即,除了null原型对象之外的所有对象)都继承了__lookupSetter__()方法。如果已为对象的属性定义了设置器,则无法通过该属性引用设置器函数,因为该属性仅在设置时调用该函数。__lookupSetter__()可用于获取对设置器函数的引用。

__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]

以标准方式查找属性的设置器

您应该使用Object.getOwnPropertyDescriptor() API 来查找属性的设置器。与__lookupSetter__()相比,此方法允许查找符号属性。Object.getOwnPropertyDescriptor()方法也适用于null原型对象,这些对象不继承自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 语言规范
# sec-object.prototype.__lookupSetter__

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅