有没有办法检测对象的属性何时被更改

Is there a way to detect when an object's properties have been changed?

本文关键字:何时 属性 检测 对象 有没有      更新时间:2023-09-26

如何检测对象的属性在Javascript中是否发生了变化?我特别希望在对象上的属性数量发生变化(无论它是获得还是失去属性)时调用函数。我想避免使用方法并设置和更改对象的属性,因为这很快就会变得相当笨拙,setInterval显然不是一种选择。那么,这可能吗?


编辑:我专门寻找一种方法,通过类似于 Array 对象上的属性的 length 属性获取对象属性的长度。我假设每当添加或删除索引时,他们都会更改长度,但显然情况并非如此。Javascript的原始设计者是如何做到这一点的?

嗯,常见的方法是有一个getter和setter类型的函数来做到这一点,类似于骨干网的模型。您可以通过函数修改数据,然后函数在执行要执行的操作之前执行其他处理(如执行侦听器、检查属性等)。

function ListenableObject(data){
    var that = this;
    this.data = data;
    this.listeners = [];
    this.edit = function(newvalues){
        //modify data
        //execute listeners
    }
    this.addListener = function(callback){
        that.listeners.push(callback);
    }
}
var mydata = new ListenableObject({'foo':'bar'});
mydata.addListener(function(){...callback...});
mydata.edit(somedata);

因此,总结一下我通过评论所说的一切:ES6 将提供代理,这些代理应该为"新属性"或"属性已删除"等事件启用处理程序。(不过,我还没有研究那么多。不幸的是,代理需要数年时间才能跨浏览器。

至于对象的length属性,你可以为此定义一个getter函数,但这在IE8中会中断,因为IE只在IE9中实现了getter。因此,这为您提供了一种length()方法。所以:

function objectLength () {
    return Object.keys( this ).length;
}

然后,确保对象具有此函数(作为自己的属性或继承的属性):

yourObj.length = objectLength;

YourConstructor.prototype.length = objectLength;
根据您的

要求,简短的回答是不可能做您想做的事情。 至少,现在还没有。 您可以使用一些技术来获得相同的功能,同时将对代码的影响降至最低。 这是我个人最喜欢的一个 - 在SO的某个地方发现 - 如果我能找到,我会链接。

function myObj(){
   var _this = this;
   // onUpdate callbacks
   this.onBeforeUpdate = [];
   this.onAfterUpdate  = [];
   this.UpdateProperty = function( prop, value ){
      // execute onBeforeUpdate callbacks...  
      for ( var i = 0; i < _this.onBeforeUpdate.length; i++ )
         _this.onBeforeUpdate[i]();
      _this[prop] = value;
      // execute onAfterUpdate callbacks...
      for ( var i = 0; i < _this.onAfterUpdate.length; i++ )
         _this.onAfterUpdate[i]();
   };
}
当然,这个

例子可以通过自由使用原型赋值来表现得更好,但你可以看到它的意图。