Edit 2016.03 : Object.observe
est déprécié et supprimé dans Chrome 50
~~**Modification 2014.05 : `Object.observe` a été ajouté dans Chrome 36**.
Chrome 36 est doté d'une fonction native Object.observe
qui peut être exploitée ici :
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Si vous ne le voulez que temporairement, vous devriez stocker le callback dans une variable et appeler Object.unobserve
une fois terminé :
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Notez que lorsque vous utilisez Object.observe
vous ne serez pas notifié si l'affectation n'a rien changé, par exemple si vous avez écrit myObj.a = 1
.
Pour voir la pile d'appels, vous devez activer l'option "async call stack" dans Dev Tools :
~~
Réponse originale (2012.07) :
A console.watch
croquis comme suggéré par @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;
}
});
}
Invocation :
console.watch(obj, "someProp");
Compatibilité :
- Dans Chrome 20, vous pouvez le coller directement dans Dev Tools au moment de l'exécution !
- Pour être complet : dans Firebug 1.10 (Firefox 14), vous devez l'injecter dans votre site web (par exemple via Fiddler si vous ne pouvez pas éditer la source manuellement) ; malheureusement, les fonctions définies depuis Firebug ne semblent pas se briser sur
debugger
(ou est-ce une question de configuration ? Veuillez me corriger dans ce cas), mais console.log
travaux.
~~Notez que dans Firefox, `console.watch` existe déjà, à cause du [`Object.watch`] non standard de Firefox (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/Object/watch). Ainsi, dans Firefox, vous pouvez surveiller les changements de manière native :
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69~~
Edit : Object.watch
a été supprimé dans Firefox 57.