如何观察作为对象的对象的价值

时间:2014-01-13 18:41:25

标签: javascript jquery prototype

我有一个像这样的对象: var obj = {key1: "hello", key2: {keyA: "1", keyB: "2"}}

我目前正在使用此代码观看所选键的值何时发生变化:

if (!Object.prototype.watch) {
    Object.defineProperty(Object.prototype, "watch", {
        enumerable : false,
        configurable : true,
        writable : false,
        value : function(prop, handler) {
            var oldval = this[prop], newval = oldval, getter = function() {
                return newval;
            }, setter = function(val) {
                oldval = newval;
                return newval = handler.call(this, prop, oldval, val);
            };

            if (
            delete this[prop]) {// can't watch constants
                Object.defineProperty(this, prop, {
                    get : getter,
                    set : setter,
                    enumerable : true,
                    configurable : true
                });
            }
        }
    });
}

// object.unwatch
if (!Object.prototype.unwatch) {
    Object.defineProperty(Object.prototype, "unwatch", {
        enumerable : false,
        configurable : true,
        writable : false,
        value : function(prop) {
            var val = this[prop];
            delete this[prop];
            // remove accessors
            this[prop] = val;
        }
    });
}

obj.watch("key1", function(id, oldval, newval) {

    console.log(newval)

});
`

当“你好”改变时,我可以处理事件。但是,如果对象的属性发生变化(Key2)而没有使用前一个函数对象的所有元素(KeyA和KeyB),我怎么能处理事件?

更好地说..当一个对象发生变化时,可以在不监视该对象的所有元素的情况下得到通知吗?

Thaaanku

2 个答案:

答案 0 :(得分:1)

  

当对象 [property] 更改时,可以在不监视该对象的所有元素的情况下获得通知吗?

没有。您的watch函数依赖于getter / setter,它们始终是特定于属性的。你能做什么:

答案 1 :(得分:0)

正如您所看到的,使用手表可以在不合规的浏览器上工作的polyfill,可以在javascript中轻松实现观看属性更改。 由于您需要的不同于任何现有功能,您必须使用属性更改处理程序(例如:function handleObjectChange(obj, oldPropValue, newPropValue, propertyPath))来查找属性链中的任何更改的自定义功能,其中propertyPath是一个数组,通向更改的属性(expl1:['KeyA']; expl2:['TimeData','duration'])和oldPropValue / newPropValue是刚改变的属性的旧/新值。
当对象本身发生更改时,propertyPath为null / undefined,在这种情况下,old/new PropertyValue包含对象的旧/新值。

显然,这只是实现目标的一种方式,但基本点是:因为这是一个特定需求,建立自己的具体答案。