2013-02-13 4 views
8

JavaScript hat getters mit Object.defineProperty. So kann ich einen Getter auf das Grundstück definiert random von window vonDefinieren Sie eine Universal/Fallback-Getter-Eigenschaft in JavaScript

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

random // Evaluates to a random number 

Ist es möglich, ein „universelles Getter“ für ein bestimmtes Objekt, unabhängig von der Objekteigenschaft zu definieren? Ich suche etwas wie

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

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

Kann ich "universelle Getters" in JavaScript?

+0

möglich Duplikat besuchen sollte [Ist es möglich, dynamische Getter/Setter in JavaScript implementieren?] (http://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript) – user123444555621

+1

Siehe auch http: // stackoverflow .com/questions/2266789/is-da-ein-gleich-von-der-nosuchmethod-feature-for-properties-or-away – user123444555621

Antwort

4

Nr

Es ist nicht möglich in ECMAScript 5. Auflage zu tun, wie es keine Bestimmung für diesen Vorgang ist. Obwohl dies nicht explizit angegeben ist, ist ersichtlich, dass [GetProperty] keine Vorkehrungen für nicht vorhandene Eigenschaften enthält.

Die Getter/Setter in ECMAScript erfordern vorhandenen Eigenschaften und es gibt kein Äquivalent von Rubys method_missing oder Python __getattribute__.

10

Leider: Nein, gibt es nicht.

Es Proxy Objekte Eingeführt in Gecko 18 basierten Browsern

genannt wird somehthing Was du Dinge wie diese

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

Aber das ist nicht Standard- und immer noch sehr instabil

zu tun erlauben würde,

BTW Ich dachte ursprünglich, Sie könnten direkt window als lokale Variable in der IIFE verwenden, aber es scheint, dass Sie nicht können Es protokolliert nur undefined (fragen, warum), damit ich aktiviert das „W“

Heres ein Beispiel auf JSBin

Hinweis: Sie es in Firefox

+1

['Proxy'] (https: //developer.mozilla. org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Proxy) ist jetzt Standard und wird als Teil von ES2015 implementiert – CletusW