Редагувати 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:
Оригінальна відповідь (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 року) знято .