有没有办法检测对象的属性何时被更改
Is there a way to detect when an object's properties have been changed?
如何检测对象的属性在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]();
};
}
当然,这个例子可以通过自由使用原型赋值来表现得更好,但你可以看到它的意图。
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 我应该何时在WebGL/OOpenGL中启用/禁用顶点位置属性
- 如何监视 jQuery 中主体“data”属性何时更改
- 有没有办法检测对象的属性何时被更改
- 何时使用“原型”一词向 javascript 中的对象添加新属性
- 何时应该使用 on* DOM 属性与 on* HTML 属性
- 角度指令-知道绑定到属性的对象何时更改
- Backbone.js:总是检测模型何时有属性集,而不是/只是/更改
- 何时使用.attr()设置/更改适当的属性值
- 是否可以知道何时删除属性
- 检测何时填充了hasMany属性而没有结果
- 我应该何时初始化javascript属性
- 如何检测DOM元素的class属性何时发生变化
- 何时访问属性(vs .属性)
- HTML表单.何时在目标属性中使用命名框架
- 知道何时使用数组表示法将属性设置为对象
- HTML5脚本元素 - 异步属性 - 何时(以及如何最好)使用
- 确定对象何时只具有某些属性