2013-02-13 20 views
8

JavaScript, Object.defineProperty numaralı toplayıcılara sahiptir. Bu yüzdenBir Evrensel/Fallback getter özelliğini tanımlayın JavaScript

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

random // Evaluates to a random number 

tarafından window mülkiyet random üzerinde bir alıcı tanımlayabilirsiniz ne olursa olsun nesne özelliğinin, belirli bir nesne için bir "evrensel getter" tanımlamak mümkün mü? Ben "evrensel getters" JavaScript yapabilir

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

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

böyle bir şey yapmak arıyorum?

+0

olası yinelenen bu mümkün mü JavaScript'te dinamik alıcılar/ayarlayıcılar uygulayın?] (http://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript) – user123444555621

+1

Ayrıca bkz. http: // stackoverflow .com/question/2266789/is-there-bir-nosuchmethod özelliği-özellikleri-veya-bir-yol – user123444555621

cevap

4

sayılı

işlem için hiçbir düzenleme yoktur olarak ECMAScript 5 baskısında yapmak mümkün değildir. Açıkça belirtilmemiş olsa da, [GetProperty]'un mevcut olmayan özellikler için herhangi bir hüküm içermediği görülebilir.

getters/ECMAScript'te yılında belirleyiciler mevcut özellikler gerektiren ve Ruby'nin method_missing veya Python en __getattribute__ hiçbir eşdeğer yoktur.

10

Maalesef: Hayır, yok.

Proxy Bu

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

gibi şeyler yapmak için izin verecek tabanlı tarayıcılar

Gecko 18'de sunulan Nesneleri Ama bu çok dengesiz hala Standardı ve olduğunu Orada denilen somehthing edilir

Btw Başlangıçta, window'u IIFE'de yerel değişken olarak kullanabileceğinizi düşündüm ama göremiyorsunuz sadece tanımsız günlükleri (neden merak) bu yüzden JSBin

Not

İşte bir örnek "W" harfle: Sen bunu Firefox'ta ziyaret etmelisiniz

[ait
+1

['Proxy'] (https: //developer.mozilla. org/en-US/docs/Web/JavaScript/Referans/Global_Objects/Proxy) artık standart ve ES2015'in bir parçası olarak uygulanıyor – CletusW

İlgili konular