Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何观察对象的价值,即对象的价值_Javascript_Jquery_Prototype - Fatal编程技术网

Javascript 如何观察对象的价值,即对象的价值

Javascript 如何观察对象的价值,即对象的价值,javascript,jquery,prototype,Javascript,Jquery,Prototype,我有一个这样的物体: var obj={key1:“你好”, 键2:{keyA:“1”,keyB:“2”} 我当前正在使用此代码来观察所选键的值何时更改: if (!Object.prototype.watch) { Object.defineProperty(Object.prototype, "watch", { enumerable : false, configurable : true, writable : false,

我有一个这样的物体:
var obj={key1:“你好”,
键2:{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),我如何处理事件呢

说得更好。。当对象发生更改时,是否可以在不监视该对象的所有元素的情况下获得通知

塔安库

当对象[属性]发生更改时,是否可以在不监视该对象的所有元素的情况下获得通知

不可以。您的
watch
函数依赖于getter/setter,它们始终是特定于属性的。您可以做什么:

  • 将您的对象实现为一个,它的设计目的正是为了实现您想要的。然而,这只是一个草案,目前只是一个例子
  • 使用,但这也只是一个草稿
  • 使用一个显式的getter/setter方法,该方法获取更新的属性名作为参数

正如您可以看到的那样,通过polyfill,watch可以在不兼容的浏览器上工作,监视属性更改可以在javascript中轻松实现。
由于您需要的功能不同于任何现有功能,因此必须使用自定义功能,该功能将查找属性链中的任何更改,并使用类似以下属性更改处理程序:
function handleObjectChange(obj、oldPropValue、newPropValue、propertyPath)
,其中propertyPath是指向已更改属性的数组(expl1:['KeyA'];expl2:['TimeData','duration'])和
oldPropValue
/
newPropValue
是刚刚更改的属性的新旧值。
当对象本身发生更改时,
propertyPath
为空/未定义,在这种情况下,
old/newpropertyValue
包含对象的旧/新值

显然,这只是实现你所追求的目标的一种方式,但基本点是:既然这是一种特定的需求,那么就构建你自己的特定答案