Edycja 2016.03: Object.observe
została wycofana i usunięta w przeglądarce Chrome 50
Edycja 2014.05: Object.observe
została dodana w Chrome 36
Chrome 36 jest dostarczany z natywną Object.observe
implementacją, którą można wykorzystać tutaj:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Jeśli chcesz to tylko tymczasowo, powinieneś przechowywać callback w zmiennej i wywołać Object.unobserve
po zakończeniu :
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Zwróć uwagę, że podczas używania Object.observe
nie zostaniesz powiadomiony, gdy przydział niczego nie zmienił, np. Jeśli napisałeś myObj.a = 1
.
Aby zobaczyć stos wywołań, musisz włączyć opcję „async call stack” w Dev Tools:
Oryginalna odpowiedź (2012.07):
console.watch
Szkic jak sugeruje @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;
}
});
}
Wezwanie:
console.watch(obj, "someProp");
Zgodność:
- W Chrome 20 możesz wkleić go bezpośrednio w narzędziach deweloperskich w czasie wykonywania!
- Dla kompletności: w Firebug 1.10 (Firefox 14) musisz wstrzyknąć go do swojej witryny (np. Przez Fiddlera, jeśli nie możesz ręcznie edytować źródła); niestety, funkcje zdefiniowane w Firebug nie wydają się działać
debugger
(czy jest to kwestia konfiguracji? proszę mnie w takim razie poprawić), ale console.log
działają.
Edytować:
Zauważ, że w Firefoksie console.watch
już istnieje z powodu niestandardowego Firefoksa Object.watch
. Dlatego w Firefoksie możesz natywnie obserwować zmiany:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Jednak wkrótce (koniec 2017 r.) Zostanie to usunięte .