如何在Javascript中创建命名空间静态函数?

4

现在,我正在使用这种方式:

window.Foo = {
  alpha: function() {},
  bravo: function(arg) {}
}
window.Bar = {
  charlie: function(arg) {}
}

Foo.alpha()
Bar.charlie()

但我怀疑这不是“正确”的做法,因为(1)我的IDE在理解我的意思方面有些困难(例如,如果我输入Foo.,它无法自动完成函数名称),(2)如果我遍历命名空间并仅返回eachonetypeof,我得到的是String

3个回答

4
这段代码:
for(var key in window.Foo) 
{
  // Code  
}

只将属性名称分配给变量key,该变量是一个字符串。如果您需要关联的对象(或函数),请改用此方法:

for(var key in window.Foo) 
{
  var obj = window.Foo[key];
  // Code using obj
}

Matthew Flaschen所说,像JavaScript这样的动态语言很难解析,因此如果您的IDE不理解某些内容,不用太担心。

3

如果您不需要私有变量,那么完全没有问题。动态语言很难解析,您的IDE可能无法理解这一点。

如果您确实需要一个私有类字段,另一种选择是:

window.Foo = new (function(){
  var some_private;
  this.alpha = function(){},
  this.bravo = function(arg){// use arg and some_private}
})();

关于迭代,我怀疑你正在使用类似以下代码:

for(var key in window.Foo) 
{ 
  print(typeof key); 
}

尝试:

for(var key in window.Foo) 
{ 
  print(typeof window.Foo[key]); 
}

2
请注意,for each ... in 是仅适用于 Mozilla 的结构。此外,for (key in window.Foo) 可能会导致 key 被声明为全局对象上的属性(在 ES5 严格模式下会导致 ReferenceError),建议改用 for (var key in window.Foo) - Christian C. Salvadó

2

试试这个。也许你的IDE可以正确处理它。

var Foo = {
   test: function() {},
   test2: function() {}
};

for(var prop in Foo) {
    console.log(typeof Foo[prop]); // Will log 'function'
}

window.Foo = Foo;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接