2013-02-13 2 views
8

У JavaScript есть геттеры с Object.defineProperty. Таким образом, я могу определить поглотитель на свойстве random из window поОпределить свойство универсального/возвратного геттера в JavaScript

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

random // Evaluates to a random number 

Можно ли определить «универсальный поглотитель» для данного объекта, независимо от свойства объекта? Я хочу сделать что-то вроде

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

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

Могу ли я делать «универсальные геттеры» в JavaScript?

+0

возможно дубликат [Можно ли реализовать динамические геттеры/сеттеры в JavaScript?] (http://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript) – user123444555621

+1

Также см. http: // stackoverflow .com/questions/2266789/is-there-a-a-an-the-the-nosuchmethod-feature-for-properties-or-way – user123444555621

ответ

4

No.

Это невозможно сделать в ECMAScript 5-е издание, как там не предусмотрено для этой операции. Хотя это не указано явно, можно видеть, что [GetProperty] не содержит никаких положений для несуществующих свойств.

Газопоглотители/сеттера в ECMAScript требуют существующих свойств и не существует эквивалента Руби method_missing или Питон __getattribute__.

10

К сожалению: нет, не существует.

Там будет somehthing называется Proxy объектов Появилось в Gecko 18 броузеры

, которые позволили бы вам делать вещи, как этот

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

Но это не Standard и еще очень неустойчивы

Btw Первоначально предполагалось, что вы можете использовать window в качестве локальной переменной в IIFE, но, похоже, вы не можете это просто журналы неопределенный (интересно, почему), поэтому я заглавный «W»

Вот пример на JSBin

Примечания: Вы должны посетить его в Firefox

+1

['Proxy'] (https: //developer.mozilla. org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) теперь является стандартным и реализуется как часть ES2015 – CletusW

Смежные вопросы