var obj = {};
obj.a = 1; // fire event, property "a" added 这个问题不同于this one,其中正在讨论检测已经声明的属性何时发生更改的方法。
发布于 2012-10-02 02:25:27
从技术上讲,这是可能的,但因为我所知道的所有当前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?这允许你在某种程度上跟踪一个物体,但同样,要做到10/秒是相当多的工作。谁知道呢,也许物体在两个间隔之间也会发生几次变化。
总而言之,我觉得这是一个不太理想的方法……也许比较JSON.stringify对象的字符串常量会更容易,但这确实意味着遗漏了函数和原型属性(尽管我在本例中将它们过滤掉了)。
我曾经考虑过做一些类似的事情,但最终只是使用我的事件处理程序更改了有问题的对象来检查是否有任何更改。
或者,您也可以尝试创建一个DOMElement,并将onchange侦听器附加到该侦听器...不幸的是,同样,函数/方法可能很难跟踪,但至少它不会像上面的代码那样减慢脚本的速度。
发布于 2012-10-02 02:07:41
您可以对对象的属性进行计数,并查看与上次检查时是否发生了更改:
How to efficiently count the number of keys/properties of an object in JavaScript?
这是一个粗略的解决方法,用于在语言中找不到适当的功能支持的情况下使用。
发布于 2017-03-02 18:15:51
如果性能很重要,并且您可以控制更改对象的代码,请创建一个控件类来为您修改对象,例如
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操作时,会为特定的字段路径激发更改事件,从而允许数据绑定视图在其基础数据发生更改时进行更新。
https://stackoverflow.com/questions/12678517
复制相似问题