我试图确定观察变量值并跟踪其变化的最佳方法,例如“语言”或“时区”,然后在更改时根据新值采取一些操作。
我想过使用setInterval,但我的网站上有很多'间隔',所以我不想过度使用它,我担心它可能会影响用户体验。相反,我发现自己被迫在每个方法中的值更改后可能会更改变量的值时触发我想要完成的操作,这很简单但是使我的代码紧密耦合。
你对此有何建议。
答案 0 :(得分:1)
您应该使用Object.prototype.watch()
来跟踪变量的更改
watch()方法监视要为其分配值的属性 发生这种情况时运行一个函数。 用于分配此对象中名为prop的属性的手表, 每当prop设置和存储时调用handler(prop,oldval,newval) 该属性中的返回值。观察点可以过滤(或 nullify)值赋值,返回一个修改过的newval(或者 返回oldval)。
如果删除已设置监视点的属性,则为 观察点不会消失。如果你以后重新创建属性,那么 观察点仍然有效。
要删除观察点,请使用unwatch()方法。默认情况下 watch方法由来自Object的每个对象继承。
没有标准,但您可以使用gist polifill
创建的eli-grey无论如何,这是Listening for variable changes in JavaScript or jQuery
的副本答案 1 :(得分:1)
似乎Object.observe
几乎就是你所需要的;不幸的是,它目前被提议作为“post ECMAScript 6”规范,所以它将有一段时间,直到它在浏览器中广泛使用。虽然存在填充实现(例如here或here),但它们可以在当前浏览器中提供相同的功能。
另一种方法是在direct proxy中包装有问题的对象,但这些是ES6的一部分,并且还没有被浏览器广泛采用。
答案 2 :(得分:0)
在像C ++这样的语言中,您可以使用访问器方法执行此操作。
例如,您不是使用foo.bar
之类的内容访问类的属性,而是说foo.getBar()
。
getBar()
看起来像这样:
this.getBar = function(){
console.log("bar was accessed");
return bar;
}
您还应该有一种方法来设置bar的值,即
this.setBar = function(newBar){
console.log("Setting the value of bar");
bar = newBar;
}
这些方法也可以让您更好地控制变量。例如,如果有人试图将字符串分配给应该是整数的字符串,则可能会抛出错误。或者,如果您有一个名为" length"的变量,如果有人试图将其设置为小于零,则可能会抛出错误。