我有一个在对象或数组上设置getter和setter的函数。 我的问题是,如果设置值是一个对象,我无法检测到它的内部更改,但只有在访问时才会通过getter访问它。当getter返回对象时,我想在返回getter之后执行一个动作,而不是更改它。
我的代码:
set = function(obj, i, val) {
Object.defineProperty(obj, i, {
set(newVal) {
val = newVal
// react to changes
insert(val, i)
},
get() {
return val
//I want this to run after the object was accessed and possibly changed
if (typeof val == "object") {
insert(val, i)
}
},
configurable: true,
enumerable: true
})
}
我想到了一个setTimeout的解决方案,但是如果删除了setter和getter,setTimeout可能会导致不必要的行为,我宁愿代码保持同步。
我考虑过的另一个想法是在所有对象属性上定义setter和getter,但这会很昂贵。
我该如何解决这个问题?
答案 0 :(得分:1)
我想到了一个解决方案,即setTimeout ......
你是这样做的,或Promise.resolve().then(...)
。
......我宁愿代码保持同步。
不能同步。您可以在getter返回后执行操作,也可以是同步操作。你无法双管齐下。
那就是说,不能保证在使用getter之后不久做异步会检测到对象完成的任何事情。考虑:
var o = yourObject.theProperty;
setTimeout(function() {
o.foo = "bar";
}, 6000);
theProperty
上的getter在第一行执行。直到六秒钟后才更改对象。
如果要检测对象的更改,请将其所有属性的getter / setter属性设置为无法重新配置,并根据您看到的更改执行操作。 (您也可以使用Object.freeze
或Object.seal
来阻止添加新属性。)
如果您希望对象能够拥有您尚未定义的属性,但您仍希望对它们的更改作出反应,则必须使用Proxy
,同时性能会受到影响。但是对于一组已知的属性,不可配置的getter / setter属性可以完成这项工作。