Javascript定义器

Javascript定义器,javascript,getter,Javascript,Getter,除了a[I](在使用vari执行getter时)之外,还有其他方法可以执行getter吗 编辑: 我在问如何使用var I来实现它。我会更好地解释真正的问题 我在名称空间对象上使用getter仅在需要时加载模块 var a = {}; a.__defineGetter__('test',function() {return 5;}); var i ="test"; 在这种情况下,我尝试加载所有模块: MyNameSpace.__defineGetter__('db',functio

除了
a[I]
(在使用
vari
执行getter时)之外,还有其他方法可以执行getter吗

编辑:

我在问如何使用
var I
来实现它。我会更好地解释真正的问题

我在名称空间对象上使用getter仅在需要时加载模块

var a = {}; 

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

var i ="test";  
在这种情况下,我尝试加载所有模块:

MyNameSpace.__defineGetter__('db',function(){MyNameSpace.loadModule('db');});
我在代码中使用了Google closure编译器,它将上述循环减少为:

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

没有模块被加载。我试图“欺骗”gcc让我加载模块。

您可以执行
a.test
a['test']
-两者都将访问
a
test
属性,并因此调用getter

编辑:啊,我知道你现在想要什么了。您所做的是对getter的巧妙使用,但不幸的是getter和setter并不是当前JavaScript标准的一部分(它们在尚未得到广泛支持的ECMAScript 5中)。Google闭包工具似乎认为读取变量不会产生任何副作用,这在当前的JavaScript版本中是正确的,因此我认为没有办法绕过这一点。您必须编辑输出才能将这些内容插回


另外,这与您的问题无关,但我确实希望您在
for in
构造中执行额外的
hasOwnProperty
检查。

我猜闭包编译器优化了代码,因为它实际上除了访问属性之外什么都不做。这应该起作用:

for(var i in MyNameSpace);

看看您的模块示例,似乎您只想在那里进行一些重构

module = {}; // global
for (var i in MyNameSpace){
    module = MyNameSpace[i];
}

如果函数本身没有那么简单,那么您同样希望提前将函数收集到一个方便的字典中,然后循环这些函数以创建getter,然后再次循环以创建load all函数。

OP似乎希望使用
i
变量。(使用var i执行此操作时)
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);
  }
}