2013-02-13 15 views
8

JavaScript ha getter con Object.defineProperty. Così posso definire un getter sulla proprietà random di window daDefinire una proprietà getter Universal/Fallback in JavaScript

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

random // Evaluates to a random number 

E 'possibile definire un "getter universale" per un determinato oggetto, indipendentemente dalla proprietà dell'oggetto? Sto cercando di fare qualcosa come

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

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

Posso fare "getter universali" in JavaScript?

+0

possibile duplicato [E 'possibile implementare getter/setter dinamici in JavaScript?] (http://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript) – user123444555621

+1

Vedere anche http: // stackoverflow .com/questions/2266789/is-there-an-equivalent-of-the-nosuchmethod-funzione-per-proprietà-o-a-via – user123444555621

risposta

4

No.

Non è possibile fare in 5 ° edizione ECMAScript come non v'è alcuna disposizione per questa operazione. Mentre tale non è dichiarato esplicitamente, si può vedere che [GetProperty] non fornisce alcuna disposizione per le proprietà non esistenti.

I getter/setter in ECMAScript richiedono proprietà esistenti e non v'è alcun equivalente di Ruby o Python method_missing di __getattribute__.

10

Sfortunatamente: No, non c'è.

C'è somehthing chiamato Proxy oggetti Introdotto nel Gecko 18 browser basati

che permetterebbe di fare cose come questa

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

ma questo è non standard e ancora molto instabile

Btw Originariamente pensavo si potesse usare direttamente window come variabile locale nell'IIFE ma sembra che non sia possibile solo tronchi undefined (chiedendo perché) così ho capitalizzato la "W"

Ecco un esempio su JSBin

Nota: Si consiglia di visitare in Firefox

+1

['Proxy'] (https: //developer.mozilla. org/it-it/docs/Web/JavaScript/Riferimento/Global_Objects/Proxy) è ora standard e implementato come parte di ES2015 – CletusW

Problemi correlati