Edit 2016.03: Object.observe
ist in Chrome 50 veraltet und entfernt
Edit 2014.05: Object.observe
wurde in Chrome 36 hinzugefügt
Chrome 36 wird mit einer nativen Object.observe
Implementierung geliefert, die hier genutzt werden kann:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Wenn Sie es nur vorübergehend möchten, sollten Sie den Rückruf in einer Variablen speichern und aufrufen, Object.unobserve
wenn Sie fertig sind:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Beachten Sie, dass Sie bei der Verwendung Object.observe
nicht benachrichtigt werden, wenn die Zuordnung nichts geändert hat, z. B. wenn Sie geschrieben haben myObj.a = 1
.
Um den Aufrufstapel anzuzeigen, müssen Sie die Option "Asynchroner Aufrufstapel" in den Entwicklungstools aktivieren:
Ursprüngliche Antwort (2012.07):
Eine console.watch
Skizze wie von @katspaugh vorgeschlagen:
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;
}
});
}
Aufruf:
console.watch(obj, "someProp");
Kompatibilität:
- In Chrome 20 können Sie es zur Laufzeit direkt in Dev Tools einfügen!
- Der Vollständigkeit halber: In Firebug 1.10 (Firefox 14) müssen Sie es in Ihre Website einfügen (z. B. über Fiddler, wenn Sie die Quelle nicht manuell bearbeiten können). Leider scheinen die in Firebug definierten Funktionen nicht zu funktionieren
debugger
(oder ist es eine Frage der Konfiguration? Bitte korrigieren Sie mich dann), aber sie console.log
funktionieren.
Bearbeiten:
Beachten Sie, dass in Firefox console.watch
bereits vorhanden ist, da Firefox nicht dem Standard entspricht Object.watch
. Daher können Sie in Firefox nativ auf Änderungen achten:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Dies wird jedoch bald (Ende 2017) entfernt .