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__

浏览器兼容性

另见