Chỉnh sửa 2016.03: Object.observe
không dùng nữa và bị xóa trong Chrome 50
Chỉnh sửa 2014.05: Object.observe
đã được thêm vào Chrome 36
Các tàu Chrome 36 có Object.observe
triển khai riêng có thể được tận dụng tại đây:
myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
console.log("Changes:");
console.log(changes);
debugger;
})
myObj.a = 42;
Nếu bạn chỉ muốn tạm thời, bạn nên lưu trữ gọi lại trong một biến và gọi Object.unobserve
khi hoàn tất:
myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;
Lưu ý rằng khi sử dụng Object.observe
, bạn sẽ không được thông báo khi bài tập không thay đổi bất cứ điều gì, ví dụ nếu bạn đã viết myObj.a = 1
.
Để xem ngăn xếp cuộc gọi, bạn cần bật tùy chọn "async call stack" trong Dev Tools:
Câu trả lời gốc (2012/07):
Một console.watch
bản phác thảo theo đề xuất của @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;
}
});
}
Cầu nguyện:
console.watch(obj, "someProp");
Khả năng tương thích:
- Trong Chrome 20, bạn có thể dán trực tiếp vào Dev Tools khi chạy!
- Để hoàn thiện: trong Fireorms 1.10 (Firefox 14), bạn phải đưa nó vào trang web của mình (ví dụ: qua Fiddler nếu bạn không thể chỉnh sửa nguồn theo cách thủ công); thật đáng buồn, các chức năng được xác định từ Fireorms dường như không bị
debugger
hỏng (hoặc đó là vấn đề về cấu hình? vui lòng sửa lại cho tôi sau đó), nhưng vẫn console.log
hoạt động.
Biên tập:
Lưu ý rằng trong Firefox, console.watch
đã tồn tại, do không chuẩn của Firefox Object.watch
. Do đó trong Firefox, bạn có thể theo dõi các thay đổi nguyên bản:
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69
Tuy nhiên, điều này sẽ sớm bị xóa (cuối năm 2017) .