2010-08-18 76 views
4

現在,我使用這種方式:如何在Javascript中創建名稱空間靜態函數?

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

Foo.alpha() 
Bar.charlie() 

但我懷疑,這是不是「正確」的方式來做事,因爲(1)我的IDE理解我的意思在幾個方面扼流圈起來(例如,如果我鍵入Foo.,將不會自動完成函數名稱);(2)如果我遍歷命名空間,並且返回typeof eachone,則得到String

回答

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

請注意,「對於每個... in」是僅限Mozilla的構造。另外'for(key in window.Foo)'可能會導致'key'被聲明爲全局對象的屬性(並且在嚴格模式下的ES5中將導致'ReferenceError'),'for(var key in window.Foo )'建議。 – CMS 2010-08-18 14:41:46

2

試試這個吧。也許你的IDE會處理得當

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

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

window.Foo = Foo;