Javascript defineGetter - PullRequest
       3

Javascript defineGetter

5 голосов
/ 03 сентября 2010
var a = {}; 

a.__defineGetter__('test',function() {return 5;}); 

var i ="test";  

Есть ли другой способ выполнить геттер, кроме a[i] (при использовании var i для этого)

РЕДАКТИРОВАТЬ:

Я спрашивал способы использовать var i, чтобы сделать это.Я объясню реальную проблему немного лучше.

Я использую геттеры в своем объекте пространства имен для загрузки модулей только при необходимости.

MyNameSpace.__defineGetter__('db',function(){MyNameSpace.loadModule('db');});

В этом случае я пытаюсь загрузить всеМодули:

for (var i in MyNameSpace){
    MyNameSpace[i];
}

Я использую компилятор Google Closure в своем коде, и он сокращает этот цикл выше до:

for(var i in MyNameSpace);

Модули не загружаются.Я пытаюсь "обмануть" gcc, чтобы он позволил мне загрузить модули.

Ответы [ 3 ]

7 голосов
/ 03 сентября 2010

Вы можете сделать либо a.test, либо a['test'] - оба получат доступ к свойству test a и, следовательно, вызовут получатель.

Редактировать: Ах, яувидеть именно то, что вы хотите сейчас.То, что вы делаете, - это умное использование методов получения, но, к сожалению, методы получения и установки не являются частью текущего стандарта JavaScript (они есть в ECMAScript 5, который пока не получил широкой поддержки).Инструменты Google Closure, похоже, предполагают, что чтение переменной не может иметь побочных эффектов, что верно в текущих версиях JavaScript, поэтому я не вижу способа обойти это.Вам нужно отредактировать вывод, чтобы вставить этот материал обратно.

Кроме того, это не связано с вашим вопросом, но я надеюсь, что вы делаете дополнительную проверку hasOwnProperty в for-inпостроить.

4 голосов
/ 25 мая 2011

Полагаю, компилятор closure оптимизирует код, потому что на самом деле он ничего не делает, кроме доступа к свойствам. это должно работать:

module = {}; // global
for (var i in MyNameSpace){
    module = MyNameSpace[i];
}
0 голосов
/ 14 января 2012

Глядя на пример вашего модуля, кажется, что вы просто хотите провести небольшой рефакторинг.

var moduleNames = { 'db', 'input', 'etc' };

for ( var name in moduleNames ) {
  MyNameSpace.__defineGetter__(name,function(){MyNameSpace.loadModule(name);});
}

function loadAll() {
  for ( var name in moduleNames ) {
    MyNameSpace.loadModule(name);
  }
}

Если сами функции менее тривиальны, чем это, то вы также хотите собрать функции в удобный словарьзаблаговременно, затем зациклите их, чтобы создать геттер, и снова зациклите, чтобы создать функцию загрузки всех.

...