Object.prototype.__defineSetter__()
已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。
注意: 此功能已弃用,建议使用 set 访问器 或 Object.defineProperty() API 来定义访问器。此方法的行为仅为 Web 兼容性指定,不要求在任何平台实现。它可能并非在所有地方都可用。
__defineSetter__() 方法用于 Object 实例,它将对象的属性绑定到一个函数,当尝试设置该属性时,将调用该函数。
语法
__defineSetter__(prop, func)
参数
返回值
无(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__()
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。
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__() 方法。
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__ |
浏览器兼容性
加载中…