从getter返回后执行操作

时间:2017-09-19 04:56:15

标签: javascript return getter-setter

我有一个在对象或数组上设置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,但这会很昂贵。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

我想到了一个解决方案,即setTimeout ......

你是这样做的,或Promise.resolve().then(...)

  

......我宁愿代码保持同步。

不能同步。您可以在getter返回后执行操作,也可以是同步操作。你无法双管齐下。

那就是说,不能保证在使用getter之后不久做异步会检测到对象完成的任何事情。考虑:

var o = yourObject.theProperty;
setTimeout(function() {
    o.foo = "bar";
}, 6000);

theProperty上的getter在第一行执行。直到六秒钟后才更改对象。

如果要检测对象的更改,请将其所有属性的getter / setter属性设置为无法重新配置,并根据您看到的更改执行操作。 (您也可以使用Object.freezeObject.seal来阻止添加新属性。)

如果您希望对象能够拥有您尚未定义的属性,但您仍希望对它们的更改作出反应,则必须使用Proxy,同时性能会受到影响。但是对于一组已知的属性,不可配置的getter / setter属性可以完成这项工作。