我知道如何使用JS getter和setter来处理对象属性,如此
var myObject = {
value : 0,
get property() {
return this.value;
},
set property(v) {
this.value = v;
}
}
因此调用myObject.property = 2
会设置myObject.value
,但我想知道的是,是否有某种方法可以调用myObject = 2
并仍设置myObject.value
而不是myObject
将{{1}}从对象更改为数字。
这可能是不可能的,但javascript是一种非常灵活的语言,我认为在我放弃这个想法之前,我已经向社区提出了这个问题。
答案 0 :(得分:0)
确实可能。仅适用于全局变量。
Object.defineProperties(this, {
myObject: {
get: function () {
return myObjectValue;
},
set: function (value) {
myObjectValue = value;
},
enumerable: true,
configurable: true
},
myObjectValue: {
value: 0,
enumerable: false,
configurable: true,
writable: true
}
});
myObject = 5;
console.log(myObject);
console.log(delete myObject);
现在,每次为myObject
分配值时,它实际上应运行set
函数并将值分配给其他属性。现在,如果你想减少污染,你可以创建一个IIFE并在其中使用变量来代替保存这些值。
http://jsbin.com/zopefuvi/1/edit
以下是IIFE的版本。
答案 1 :(得分:0)
请注意。在阅读此问题之前,我不知道您可以在没有Object.defineProperty
的情况下定义getter / setter。我想知道这种“速记”方法与通过Object.defineProperty
定义getter / setter方法之间的区别是什么。
我使用问题中的myObject
示例找到了
var myObject = {
value : 0,
get property() {
return this.value;
},
set property(v) {
this.value = v;
}
}
那个Object.getOwnPropertyDescriptor(myObject, 'property')
返回
get: ƒ property()
set: ƒ property(v)
enumerable: true
configurable: true
值得一提的是,在这种情况下,property
是可枚举的,这意味着它将循环显示。