2013-02-13 20 views
8

JavaScript có getters với Object.defineProperty. Vì vậy, tôi có thể xác định một getter trên tài sản random của window bởiXác định thuộc tính getter phổ/dự phòng trong JavaScript

Object.defineProperty(window, 'random', { 
    get: function() { 
     return Math.random(); 
    } 
}); 

random // Evaluates to a random number 

Có thể định nghĩa một "getter phổ quát" đối với một đối tượng nhất định, không phụ thuộc vào đối tượng sở hữu? Tôi đang tìm cách làm một cái gì đó như

Object.universalGetter(window, function (propertyName) { 
    console.log('Accessing property', propertyName, 'of window.'); 
}); 

window.Function // Prints "Accessing property Function of window." 

Tôi có thể làm "getters phổ" trong JavaScript không?

+0

thể trùng lặp của [Có thể triển khai getters/setters động trong JavaScript?] (http://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript) – user123444555621

+1

Xem thêm http: // stackoverflow .com/questions/2266789/is-there-an-equivalent-of-the-nosuchmethod-feature-for-properties-hoặc-a-way – user123444555621

Trả lời

4

số

Nó không thể làm trong ECMAScript 5th edition như không có quy định cho hoạt động này. Mặc dù không được nêu rõ, nhưng có thể thấy rằng [GetProperty] không đưa ra bất kỳ điều khoản nào đối với các thuộc tính không tồn tại.

Các getters/setters trong ECMAScript đòi hỏi tài sản hiện có và không có tương đương với Ruby method_missing hoặc Python của __getattribute__.

10

Thật không may: Không, không có.

Có somehthing gọi Proxy Objects Được giới thiệu vào Gecko 18 dựa duyệt

nào sẽ cho phép bạn làm những việc như thế này

(function (original, Window) { 
    var handler = { 
    get: function (target, propertyName) { 
     console.log('Accessing property', propertyName, 'of window.'); 
     return target[propertyName]; 
    } 
    }; 

    Window = new Proxy(original, handler); 


    console.log(Window.setTimeout); 
    // "Accessing property" 
    // "setTimeout" 
    // "of window." 

    // function setTimeout() { 
    // [native code] 
    // } 
})(window); 

Nhưng đây là không Standard và vẫn rất không ổn định

Btw Ban đầu tôi nghĩ bạn có thể sử dụng trực tiếp window làm biến cục bộ trong IIFE nhưng có vẻ như bạn không thể nó chỉ nhật ký undefined (tự hỏi tại sao) vì vậy tôi hoa "W"

Heres một ví dụ về JSBin

Lưu ý: Bạn nên truy cập vào nó trong Firefox

+1

['Proxy'] (https: //developer.mozilla. org/en-US/tài liệu/Web/JavaScript/Tham chiếu/Global_Objects/Proxy) hiện là tiêu chuẩn và được triển khai như một phần của ES2015 – CletusW