Modifica 2016.03: Object.observe
è obsoleto e rimosso in Chrome 50
Modifica 2014.05: è Object.observe
stato aggiunto in Chrome 36
Chrome 36 viene fornito con Object.observe
un'implementazione nativa che può essere sfruttata qui:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Se lo desideri solo temporaneamente, dovresti archiviare il callback in una variabile e chiamare Object.unobserve
al termine:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Tieni presente che durante l'utilizzo Object.observe
non riceverai una notifica quando il compito non ha cambiato nulla, ad esempio se hai scritto myObj.a = 1
.
Per vedere lo stack di chiamate, devi abilitare l'opzione "stack di chiamate asincrono" in Dev Tools:
Risposta originale (2012.07):
Uno console.watch
schizzo come suggerito da @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;
}
});
}
Invocazione:
console.watch(obj, "someProp");
Compatibilità:
- In Chrome 20, puoi incollarlo direttamente in Dev Tools in fase di esecuzione!
- Per completezza: in Firebug 1.10 (Firefox 14), è necessario iniettarlo nel proprio sito Web (ad es. Tramite Fiddler se non è possibile modificare manualmente la fonte); purtroppo, le funzioni definite da Firebug non sembrano rompersi
debugger
(o è una questione di configurazione? per favore correggetemi allora), ma console.log
funziona.
Modificare:
Nota che in Firefox console.watch
esiste già, a causa del non standard di Firefox Object.watch
. Quindi in Firefox, puoi guardare le modifiche in modo nativo:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Tuttavia, questo sarà presto (fine 2017) rimosso .