Edit 2016.03: Object.observeist in Chrome 50 veraltet und entfernt
Edit 2014.05: Object.observewurde in Chrome 36 hinzugefügt
Chrome 36 wird mit einer nativen Object.observeImplementierung 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.unobservewenn 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.observenicht 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.watchSkizze 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.logfunktionieren.
Bearbeiten:
Beachten Sie, dass in Firefox console.watchbereits 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 .