Trong ECMAScript 5, bạn chỉ có thể đánh chặn được/bộ hoạt động trên các thuộc tính được đặt tên cụ thể (không phổ biến tất cả các thuộc tính) qua Object.defineProperty
:
Object.definedProperty(someObj, "someProp", {
get: function() {
console.log("you tried to get someObj.someProp");
return "foo";
}
});
Ở đây, get
chức năng sẽ chạy bất kỳ mã thời gian cố gắng đọc someObj.someProp
.
Trong bản dự thảo ECMAScript 6 sắp tới, điều này sẽ có thể thông qua proxies. Một proxy có một đối tượng đích cơ bản và các hàm set/get. Bất kỳ lúc nào một tập hợp hoặc hoạt động được thực hiện trên bất kỳ thuộc tính nào của proxy, hàm thích hợp sẽ chạy, lấy làm đối số đối tượng đích của proxy, tên thuộc tính được sử dụng và giá trị được sử dụng trong nỗ lực set
.
var proxyHandler = {
get: function(obj, name){
console.log("you're getting property " + name);
return target[name];
},
set: function(obj, name, value) {
console.log("you're setting property " + name);
target[name] = value;
}
}
var underlyingObj = {};
// use prox instead of underlyingObj to use get/set interceptor functions
var prox = new Proxy(underlyingObj, proxyHandler);
Ở đây, thiết lập để nhận được giá trị tài sản trên prox
sẽ gây ra set
/get
chức năng để chạy.
Tôi không nghĩ rằng có một cách để làm điều đó ngay cả với bất kỳ thực hiện không chuẩn, và chắc chắn không phải với ECMAScript 5. Có một thực hiện không chuẩn được gọi là '__noSuchMethod__' cho các phương pháp trong Firefox, và có thể đi vào Chrome, nhưng không có gì tương tự cho các thuộc tính không hoạt động. Tuyến đường duy nhất dường như sử dụng một hàm bao bọc như 'get' mà qua đó tất cả các thuộc tính đều được truy cập. – Anurag
Liên quan: [JavaScript getter cho tất cả các thuộc tính] (http://stackoverflow.com/q/994143/1048572) – Bergi