Editar 2016.03: Object.observe
foi descontinuado e removido no Chrome 50
Editar 2014.05: Object.observe
foi adicionado no Chrome 36
O Chrome 36 é enviado com Object.observe
implementação nativa que pode ser aproveitada aqui:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Se você desejar apenas temporariamente, armazene o retorno de chamada em uma variável e ligue Object.unobserve
quando terminar:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Observe que, ao usar Object.observe
, você não será notificado quando a tarefa não mudar nada, por exemplo, se você tiver escrito myObj.a = 1
.
Para ver a pilha de chamadas, você precisa habilitar a opção "pilha de chamadas assíncronas" nas Ferramentas de Desenvolvimento:
Resposta original (2012.07):
Um console.watch
esboço sugerido por @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;
}
});
}
Invocação:
console.watch(obj, "someProp");
Compatibilidade:
- No Chrome 20, você pode colá-lo diretamente no Dev Tools em tempo de execução!
- Para ser completo: no Firebug 1.10 (Firefox 14), você deve injetá-lo em seu site (por exemplo, via Fiddler, se você não pode editar a fonte manualmente); infelizmente, as funções definidas no Firebug parecem não funcionar
debugger
(ou é uma questão de configuração? por favor me corrija), mas console.log
funciona.
Editar:
Observe que no Firefox console.watch
já existe, devido ao não padrão do Firefox Object.watch
. Portanto, no Firefox, você pode observar as alterações de forma nativa:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
No entanto, isso será removido em breve (final de 2017) .