首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测何时将属性添加到JavaScript对象?

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

Stack Overflow用户
提问于 2012-10-02 02:02:14
回答 3查看 2.2K关注 0票数 6
代码语言:javascript
运行
复制
var obj = {};
obj.a = 1; // fire event, property "a" added 

这个问题不同于this one,其中正在讨论检测已经声明的属性何时发生更改的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-02 02:25:27

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

代码语言:javascript
运行
复制
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?

这允许你在某种程度上跟踪一个物体,但同样,要做到10/秒是相当多的工作。谁知道呢,也许物体在两个间隔之间也会发生几次变化。

总而言之,我觉得这是一个不太理想的方法……也许比较JSON.stringify对象的字符串常量会更容易,但这确实意味着遗漏了函数和原型属性(尽管我在本例中将它们过滤掉了)。

我曾经考虑过做一些类似的事情,但最终只是使用我的事件处理程序更改了有问题的对象来检查是否有任何更改。

或者,您也可以尝试创建一个DOMElement,并将onchange侦听器附加到该侦听器...不幸的是,同样,函数/方法可能很难跟踪,但至少它不会像上面的代码那样减慢脚本的速度。

票数 0
EN

Stack Overflow用户

发布于 2012-10-02 02:07:41

您可以对对象的属性进行计数,并查看与上次检查时是否发生了更改:

How to efficiently count the number of keys/properties of an object in JavaScript?

这是一个粗略的解决方法,用于在语言中找不到适当的功能支持的情况下使用。

票数 0
EN

Stack Overflow用户

发布于 2017-03-02 18:15:51

如果性能很重要,并且您可以控制更改对象的代码,请创建一个控件类来为您修改对象,例如

代码语言:javascript
运行
复制
var myObj = new ObjectController({});

myObj.set('field', {});
myObj.set('field.arr', [{hello: true}]);
myObj.set('field.arr.0.hello', false);

var obj = myObj.get('field'); // obj === {field: {arr: [{hello: false}]}}

在set()方法中,与设置时间间隔和定期扫描以检查更改相比,您现在能够以相当高的性能查看每个更改发生的位置。

我在ForerunnerDB中做了类似但高度优化的事情。在数据库上执行CRUD操作时,会为特定的字段路径激发更改事件,从而允许数据绑定视图在其基础数据发生更改时进行更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12678517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档