Javascript沒有獨立的命名空間。它具有可以提供解析名稱範圍的函數和對給定範圍內可訪問的指定數據有貢獻的對象。
這裏是你的榜樣,糾正:
var namespaces = { com: { example: { /* example.com's data */ } } }
這是一個變量namespaces
被分配一個對象常量。該對象包含一個屬性:com
,具有一個屬性的對象:example
,這個對象大概會包含一些有趣的內容。
所以,你可以輸入類似namespaces.com.example。 somePropertyOrFunctionOnExample它會一切正常。當然,這也很荒謬。您沒有分層名稱空間,您的對象包含一個包含您實際關心的對象的對象。
var com_example_data = { /* example.com's data */ };
那的作品一樣好,沒有無謂的層次結構。
現在,如果你真的想向建立一個層次,你可以嘗試這樣的事:
com_example = com_example || {};
com_example.flags = com_example.flags || { active: false, restricted: true};
com_example.ops = com_example.ops || (function()
{
var launchCodes = "38925491753824"; // hidden/private
return {
activate: function() { /* ... */ },
destroyTheWorld: function() { /* ... */ }
};
})();
......這是,恕我直言,相當簡潔。
雖然,現在`com_example`將是全局對象的一部分。假設我們添加了更多的對象`com_something_else`,`com_etc`,那麼我們仍然在污染全局對象的根級別。如果我們在全局只有一個`com`對象,那麼所有其他對象都被添加了嗎?另外,我們不想覆蓋任何現有對象,如果使用多個庫,會發生什麼情況。 – Peter 2011-10-04 05:00:28
@Peter:如果多個庫定義相同的符號,無論如何你都會遇到問題;這就是爲什麼像jQuery這樣的圖書館需要這麼長的時間才能將所有內容填充到單個全局對象中我的觀點並不是你應該使用多個頂層對象,而只是用深層嵌套的對象僞造名稱空間並不會真正爲你購買任何超過瘋狂對象名稱的東西。查看我最後一個更實用的方法示例:使用不太可能發生碰撞的單個全局名稱,然後使用允許不同位代碼向其中添加對象的技術。 – Shog9 2011-10-04 15:39:14