Object.prototype.__defineSetter__()
已弃用:此功能不再推荐使用。尽管一些浏览器可能仍然支持它,但它可能已经被从相关的 Web 标准中删除,可能正在被删除,或者可能只被保留用于兼容性目的。避免使用它,并尽可能更新现有代码;请参阅本页底部的兼容性表,以指导您的决定。请注意,此功能可能随时停止工作。
注意:此功能已弃用,取而代之的是使用设置器定义,方法是使用对象初始化器语法或Object.defineProperty()
API。此方法的行为仅针对 Web 兼容性进行指定,并且不需要在任何平台上实现。它可能无法在所有地方都起作用。
Object
实例的__defineSetter__()
方法将对象的属性绑定到一个函数,该函数在尝试设置该属性时会被调用。
语法
__defineSetter__(prop, func)
参数
返回值
无 (undefined
).
异常
TypeError
-
如果
func
不是函数,则抛出此异常。
描述
所有从Object.prototype
继承的对象(即除null
-原型对象之外的所有对象)都继承了__defineSetter__()
方法。此方法允许在现有对象上定义设置器。这等效于Object.defineProperty(obj, prop, { set: func, configurable: true, enumerable: true })
,这意味着该属性是可枚举的和可配置的,并且如果存在,任何现有的获取器都将被保留。
__defineSetter__()
在规范中定义为“规范性可选”,这意味着不需要任何实现来实现它。但是,所有主流浏览器都实现了它,并且由于它被持续使用,因此不太可能被删除。如果浏览器实现了__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
以标准方式定义设置器属性
您可以在首次初始化对象时使用set
语法定义设置器。
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__()
方法。
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 的浏览器中加载。