Editar 2016,03: Object.observe
es obsoleto y eliminado en Chrome 50
Editar 2014,05: Object.observe
se añadió en Chrome 36
Chrome 36 barcos con Object.observe
implementación nativa que puede aproveche aquí:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Si desea que sólo temporalmente, debe almacenar de devolución de llamada en una variable y llamar Object.unobserve
cuando se hace:
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 se utiliza Object.observe
, usted no notificará cuando la tarea no cambia nada , p.ej si ha escrito myObj.a = 1
.
Para ver la pila de llamadas, necesita habilitar la opción "asíncrono pila de llamadas" en Herramientas de desarrollo:
Respuesta original (2012.07):
Un boceto de console.watch
según lo sugerido por @katspaugh:
console = console || {}; // just in case
console.watch = function(oObj, sProp) {
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, se puede pegar directamente en Herramientas de desarrollo en tiempo de ejecución!
- Para completar: en Firebug 1.10 (Firefox 14), debe insertarlo 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 romperse en
debugger
(¿o es una cuestión de configuración? Corrígeme entonces), pero console.log
funciona.
Editar:
Tenga en cuenta que en Firefox, console.watch
ya existe, debido a Firefox no estándar Object.watch
.De ahí que en Firefox, se 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, this will be soon (late 2017) removed.
Si desea hacer esto con los elementos HTML ver http://stackoverflow.com/a/32686203/308851 – chx