Editar 2016.03: Object.observe
está en desuso y se elimina en Chrome 50
Editar 2014.05: Object.observe
se agregó en Chrome 36
Chrome 36 se entrega con Object.observe
implementación nativa que se puede aprovechar aquí:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Si lo desea solo temporalmente, debe almacenar la devolución de llamada en una variable y llamar Object.unobserve
cuando haya terminado:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Tenga en cuenta que cuando lo use Object.observe
, no se le notificará cuando la tarea no haya cambiado nada, por ejemplo, si ha escrito myObj.a = 1
.
Para ver la pila de llamadas, debe habilitar la opción "pila de llamadas asíncronas" en Dev Tools:
Respuesta original (2012.07):
Un console.watch
boceto 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;
}
});
}
Invocación:
console.watch(obj, "someProp");
Compatibilidad:
- En Chrome 20, puedes pegarlo directamente en Dev Tools en tiempo de ejecución.
- Para completar: en Firebug 1.10 (Firefox 14), debe inyectarlo en su sitio web (por ejemplo, a través de Fiddler si no puede editar la fuente manualmente); Lamentablemente, las funciones definidas de Firebug no parecen activarse
debugger
(¿o es una cuestión de configuración? Corríjame entonces), pero console.log
funciona.
Editar:
Tenga en cuenta que en Firefox, console.watch
ya existe, debido al no estándar de Firefox Object.watch
. Por lo tanto, en Firefox, puede observar los cambios de forma nativa:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Sin embargo, esto se eliminará pronto (a fines de 2017) .