Edycja 2016,03: Object.observe
jest przestarzała i usunięto Chrome 50
Edycja 2014,05: Object.observe
dodano Chrome 36
Chrom 36 statków z natywnym Object.observe
wykonania, który może można zastosować tutaj:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Jeśli chcesz go tylko tymczasowo, należy przechowywać zwrotnego w zmiennej i wywołać Object.unobserve
kiedy zrobić:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Należy pamiętać, że podczas korzystania Object.observe
, nie będziesz otrzymywać powiadomienia o przypisanie nic nie zmieni np jeśli napisałeś myObj.a = 1
.
Aby zobaczyć stos wywołań, musisz włączyć opcję "asynchroniczne wywołanie stosu" w Dev Narzędzia:
odpowiedź Original (2012,07):
Szkic console.watch
sugerowany przez @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;
}
});
}
Inwokacja:
console.watch(obj, "someProp");
Kompatybilność:
- W Chrome 20, można wkleić go bezpośrednio w Dev Tools przy starcie!
- Dla kompletności: w Firebug 1.10 (Firefox 14), musisz wstrzyknąć go na swoją stronę (np. Za pomocą Fiddlera, jeśli nie możesz ręcznie edytować źródła); Niestety, funkcje zdefiniowane przez Firebug nie wydają się łamać na
debugger
(czy jest to kwestia konfiguracji? proszę poprawić mnie wtedy), ale działa console.log
.
Edit:
Należy zauważyć, że w Firefox, console.watch
już istnieje, ze względu na Firefoksa niestandardowym Object.watch
.Stąd w Firefoksie można obserwować zmiany natywnie:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Jednak this will be soon (late 2017) removed.
Jeśli chcesz to zrobić z elementów HTML zobaczyć http://stackoverflow.com/a/32686203/308851 – chx