Object.prototype.__defineSetter__()

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

注意:此功能已弃用,取而代之的是使用设置器定义,方法是使用对象初始化器语法Object.defineProperty() API。此方法的行为仅针对 Web 兼容性进行指定,并且不需要在任何平台上实现。它可能无法在所有地方都起作用。

Object 实例的__defineSetter__()方法将对象的属性绑定到一个函数,该函数在尝试设置该属性时会被调用。

语法

js
__defineSetter__(prop, func)

参数

prop

包含设置器func绑定的属性名称的字符串。

func

尝试设置指定属性时要调用的函数。此函数接收以下参数

val

尝试分配给prop的值。

返回值

无 (undefined).

异常

TypeError

如果func不是函数,则抛出此异常。

描述

所有从Object.prototype继承的对象(即除null-原型对象之外的所有对象)都继承了__defineSetter__()方法。此方法允许在现有对象上定义设置器。这等效于Object.defineProperty(obj, prop, { set: func, configurable: true, enumerable: true }),这意味着该属性是可枚举的和可配置的,并且如果存在,任何现有的获取器都将被保留。

__defineSetter__()在规范中定义为“规范性可选”,这意味着不需要任何实现来实现它。但是,所有主流浏览器都实现了它,并且由于它被持续使用,因此不太可能被删除。如果浏览器实现了__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

以标准方式定义设置器属性

您可以在首次初始化对象时使用set语法定义设置器。

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

您也可以使用Object.defineProperty()在创建对象后定义设置器。与__defineSetter__()相比,此方法允许您控制设置器的可枚举性和可配置性,以及定义符号属性。Object.defineProperty()方法也适用于null-原型对象,这些对象不会从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 语言规范
# sec-object.prototype.__defineSetter__

浏览器兼容性

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

另请参阅