编辑 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):
console.watch
@katspaugh 建议的草图:
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 中,您可以在运行时直接将其粘贴到 Dev Tools 中!
- 为了完整性:在 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 中被删除。