Javascript原生並不支持命名空間,需要變通來實現。
在我們創建一個JavaScript庫時,命名空間就顯得舉足輕重了,我們可以將組成這個JavaScript庫的零散的JavaScript文件(*)封裝在命名空間中,而無須定義全局的函數或類。比如在本章節多次出現的Person,我們就可以作為庫的一部分封裝到合適的命名空間中:
Code 5-13:
複製代碼 代碼如下:
var com = {};
ava = {};
on = function(name) {
//私有成員
var _name = name;
//訪問器
ame = function() {
return _name;
};
ame = function(name) {
_name = name;
};
};
//原型
otype = {
eat:function() {
alert(ame() + " is eating something.");
},
sleep:function() {
alert(ame() + " is sleeping.");
},
walk:function() {
alert(ame() + " is walking.");
}
};
var dirk = new on("Dirk");
();
從Code 5-13中,我們得到了一個比較符合Java開發人員習慣的命名空間,而且在實例化Person對象時,也要指定我們的命令空間路徑。
這裏説一個小技巧,如果你正在使用一個別人開發好的,且帶有比較完整的命名空間規劃的JavaScript庫時,可能你會對每次都寫宂長的命名空間趕到厭倦。比如説您正在使用我開發的JavaScript庫,在命名空間下,有很多您要用到的擴展UI控件,我估計您也不希望要書寫很多次的var xxx = new ()。通過指定命名空間別名的方式,我們可以書寫更少的`重複代碼,如Code 5-14所示的另一種實例化Code 5-13中Person的方法:
Code 5-14:
複製代碼 代碼如下:
var ns = ava;
var dirk = new on("Dirk");
();
最後我將要説明的是,使用命名空間時,需要注意的一個問題。在書寫JavaScript庫時,大多數情況下命名空間聲明語句可能會同時出現在一個JavaScript文件的多個位置,或者是出現多個JavaScript文件中,但是JavaScript語言特性是最後聲明的變量會覆蓋前邊聲明的同名變量,這就需要我們注意重複聲明的問題,也就是説每次聲明命名空間對象時,建議先判斷下這個命名空間對象是否已經存在,如Code 5-15所示:
Code 5-15:
複製代碼 代碼如下:
if (typeof ava == "undefined") var ava = {};
這樣我們就能保證“ava”對象只聲明一次了。