2013-02-13 10 views
8

JavaScript ma moduły pobierające z Object.defineProperty. Więc mogę zdefiniować getter na nieruchomości random z window przezDefiniowanie właściwości gettera uniwersalnego/zastępczego w kodzie JavaScript

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

random // Evaluates to a random number 

Czy możliwe jest zdefiniowanie „uniwersalne” getter dla danego przedmiotu, niezależnie od właściwości obiektu? Szukam czegoś takiego, jak

Czy mogę zrobić "uniwersalne gettery" w JavaScript?

+0

możliwe duplikat [Czy jest możliwe zaimplementować dynamiczne pobieranie/ustawianie w JavaScript?] (http://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript) – user123444555621

+1

Zobacz także http: // stackoverflow .com/questions/2266789/is-there-an-equivalent-of-the-nosuchmethod-feature-for-properties-or-a-way – user123444555621

Odpowiedz

4

nr

Nie jest możliwe do zrobienia w ECMAScript 5. edycji jako nie przewiduje dla tej operacji. Chociaż nie jest to jednoznacznie określone, można zauważyć, że [GetProperty] nie zawiera żadnych przepisów dotyczących nieistniejących właściwości.

W pozyskiwaniu/ustawiaczy w ECMAScript wymagają istniejące właściwości i nie ma odpowiednik Ruby method_missing lub Pythona __getattribute__.

10

Niestety: Nie, nie ma.

Istnieje somehthing nazywa Proxy obiektów wprowadzonych w Gecko 18 Przeglądarki oparte

co pozwoliłoby Ci robić takie rzeczy jak to

(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); 

ale to nie standardowe i wciąż bardzo niestabilna

Początkowo sądziłem, że można bezpośrednio użyć window jako zmiennej lokalnej w IIFE, ale wydaje się, że nie można to tylko kłody niezdefiniowany (zastanawiając się, dlaczego), więc kapitalizowane „W”

Herezje przykład na JSBin

Uwaga: Należy odwiedzić go w Firefoksie

+1

['Proxy'] (https: //developer.mozilla. org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) jest teraz standardem i jest implementowany jako część ES2015 – CletusW

Powiązane problemy