我有一个我之前创建的对象。
obj = new Object();
我想在每次更改一个对象子项时触发一个函数。
例如:
function changed()
{
alert('Object changed';)
}
obj.test = 'blabla'; //fire changed().
这可能吗?谢谢
答案 0 :(得分:1)
是和否。您正在寻找的是accessors and mutators(也称为getter和setter),但不幸的是它们不是跨浏览器兼容的。
如果您只是需要注意值已更改,并且延迟不是问题,您可以使用超时循环来轮询值:
function check(key, context, callback)
{
var cachedValue;
cachedValue = context[key];
function doCheck()
{
if ( cachedValue != context[key] ) callback();
setTimeout(doCheck, 100);
}
doCheck();
}
check('test', obj, testChanged);
这当然是轮询循环如何工作的一个非常简单的例子。有更好的方法可以做到这一点。
答案 1 :(得分:1)
如果出于兼容性原因,您不希望使用Javascript getters / setter(它们相当新 - 在2009年的第5版ECMA-262中添加),那么,如果您的上下文允许,请尝试创建setter函数:
setVariable(value)
为此,您的代码必须更新才能调用这些函数而不是设置属性。
我知道如果外部库(或其他代码)正在更新属性,这可能是不可能的。建议的轮询方法是一个很好的解决方案,只要异步通知足够(当然它不能通知中间值,即在间隔之间设置的值)。