如何检测属性何时添加到 JavaScript 对象?

Sch*_*lle 6 javascript

var obj = {};
obj.a = 1; // fire event, property "a" added 
Run Code Online (Sandbox Code Playgroud)

这个问题是从不同的这一个,当已声明属性更改其中的方法来检测,正在讨论之中。

Eli*_*gem 0

从技术上来说这是可能的,但是由于我所知道的所有当前 JS 实现都是单线程的,所以它不会很优雅。我唯一能想到的是蛮力间隔:

var checkObj = (function(watchObj)
{
    var initialMap = {},allProps = [],prop;
    for (prop in watchObj)
    {
        if (watchObj.hasOwnProperty(prop))
        {//make tracer object: basically clone it
            initialMap[prop] = watchObj[prop];
            allProps.push(prop);//keep an array mapper
        }
    }
    return function()
    {
        var currentProps = [];
        for (prop in watchObj)
        {
            if (watchObj.hasOwnProperty(prop))
            {//iterate the object again, compare
                if (watchObj[prop] !== initialMap[prop])
                {//type andvalue check!
                    console.log(initialMap[prop] + ' => ' watchObj[prop]);
                    //diff found, deal with it whichever way you see fit
                }
                currentProps.push(prop);
            }
        }
        //we're not done yet!
        if (currentProps.length < allProps.length)
        {
            console.log('some prop was deleted');
            //loop through arrays to find out which one
        }
    };
})(someObjectToTrack);
var watchInterval = setInterval(checkObj,100);//check every .1 seconds?
Run Code Online (Sandbox Code Playgroud)

这允许您在某种程度上跟踪一个对象,但同样,每秒 10 次的速度需要做大量的工作。谁知道呢,也许物体在间隔之间也会改变几次。
总而言之,我觉得这是一种不太理想的方法......也许比较JSON.stringify'ed 对象的字符串常量会更容易,但这确实意味着错过函数,并且(尽管我过滤了在本例中)原型属性。

我曾经考虑过做一些类似的事情,但最终只是使用我的事件处理程序来更改相关对象来检查是否有任何更改。
或者,您也可以尝试创建一个 DOMElement,并为其附加一个onchange侦听器...遗憾的是,函数/方法可能很难跟踪,但至少它不会像上面的代码那样减慢您的脚本速度。