2010-06-24 22 views
8

Làm cách nào tôi có thể chỉ định trình khởi động mặc định cho mẫu thử nghiệm? Với getter mặc định tôi có nghĩa là một chức năng được gọi là nếu obj.undefinedProperty123 được gọi.Làm cách nào để xác định trình khởi động và thiết lập mặc định bằng ECMAScript 5?

Tôi đã thử Object.prototype.get = function (property) {..} nhưng điều này không được gọi trong trường hợp này.

+1

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

+0

Liên quan: [JavaScript getter cho tất cả các thuộc tính] (http://stackoverflow.com/q/994143/1048572) – Bergi

Trả lời

0

Tôi không chắc chắn về những gì bạn đang yêu cầu. Nhưng nếu bạn muốn một phương thức được gọi khi người dùng cố gắng truy cập object.nonExistingProperty. Tôi không nghĩ có cách nào để làm điều đó.

+0

Đó chỉ là những gì tôi muốn làm. Tôi nghĩ rằng điều đó là có thể và tôi nghĩ rằng tôi nhớ rằng tôi đã làm điều này trước đây - nếu tôi chỉ biết làm thế nào ... – Manuel

2

Firefox nó có thể với phi tiêu chuẩn noSuchMethod: -

({__noSuchMethod__:function(){alert(1);}}).a(); 
4

Gareth nói gì, ngoại trừ đó là __noSuchMethod__.

Hoặc có thể bạn đang nghĩ đến PHP?

Dưới đây là một bài viết rất hay về các getters/setters thuộc tính tiêu chuẩn hóa gần đây, làm nổi bật một số hóa thân không chuẩn trước đó.

http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/

Tóm lại: không có 'catch-all' getter/setter chuẩn (chưa), nhưng Object.defineProperty là tương lai.

4

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.

Các vấn đề liên quan