Изменить 2016.03: Object.observe
устарело и удалено в Chrome 50
Редактировать 2014.05: Object.observe
добавлено в Chrome 36
Chrome 36 поставляется с собственной Object.observe
реализацией, которую можно использовать здесь:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Если вы хотите это только временно, вы должны хранить обратный вызов в переменной и вызывать, Object.unobserve
когда закончите:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Обратите внимание, что при использовании Object.observe
вы не будете уведомлены, когда назначение ничего не изменило, например, если вы написали myObj.a = 1
.
Чтобы увидеть стек вызовов, вам нужно включить опцию «асинхронный стек вызовов» в Dev Tools:
Оригинальный ответ (2012.07):
console.watch
Эскиз как предложено @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;
}
});
}
Призвание:
console.watch(obj, "someProp");
Совместимость:
- В Chrome 20 вы можете вставить его прямо в Dev Tools во время выполнения!
- Для полноты: в Firebug 1.10 (Firefox 14) вы должны добавить его на свой веб-сайт (например, через Fiddler, если вы не можете редактировать источник вручную); к сожалению, функции, определенные из Firebug, похоже, не работают
debugger
(или это вопрос конфигурации? пожалуйста, исправьте меня тогда), но console.log
работают.
Редактировать:
Обратите внимание, что в Firefox он console.watch
уже существует из-за нестандартности Firefox Object.watch
. Следовательно, в Firefox вы можете наблюдать за изменениями:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Однако, это будет скоро (конец 2017) удалено .