编辑 2016.03:Object.observe 在 Chrome 50 中已弃用和删除
**编辑 2014.05:在 Chrome 36 中添加了“Object.observe”**
Chrome 36 附带可以在此处使用的原生 Object.observe 实现:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
如果你只是暂时想要它,你应该将回调存储在一个变量中,并在完成后调用Object.unobserve:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
请注意,当使用 Object.observe 时,如果分配没有改变任何内容,您将不会收到通知,例如如果你写过myObj.a = 1。
要查看调用堆栈,您需要在开发工具中启用“异步调用堆栈”选项:
原答案(2012.07):
@katspaugh 建议的console.watch 草图:
var console = console || {}; // just in case
console.watch = function(oObj, sProp) {
var sPrivateProp = "$_"+sProp+"_$"; // to minimize the name clash risk
oObj[sPrivateProp] = oObj[sProp];
// overwrite with accessor
Object.defineProperty(oObj, sProp, {
get: function () {
return oObj[sPrivateProp];
},
set: function (value) {
//console.log("setting " + sProp + " to " + value);
debugger; // sets breakpoint
oObj[sPrivateProp] = value;
}
});
}
调用:
console.watch(obj, "someProp");
兼容性:
- 在 Chrome 20 中,您可以在运行时直接将其粘贴到开发工具中!
- 为了完整性:在 Firebug 1.10 (Firefox 14) 中,您必须将其注入您的网站(例如,如果您无法手动编辑源代码,则通过 Fiddler);遗憾的是,从 Firebug 定义的函数似乎并没有在
debugger 上中断(或者是配置问题?请纠正我),但 console.log 有效。
请注意,在 Firefox 中,`console.watch` 已经存在,因为 Firefox 的非标准 [`Object.watch`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /对象/手表)。因此,在 Firefox 中,您可以原生地观察变化:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
罢工>
编辑:Object.watch 在 Firefox 57 中被删除。