在JavaScript中實(shí)現(xiàn)命名空間
更新時(shí)間:2006年11月23日 00:00:00 作者:
注:好久沒寫了,今天把我在公司內(nèi)網(wǎng)寫的文章拷一份,出來露露臉,剛轉(zhuǎn)Web開發(fā),所以開始學(xué)javascript!
在引入命名空間之前,一個(gè)令開發(fā)人員頭疼的問題就是如何防止函數(shù)名/類名和其他人的沖突,在一個(gè)公司內(nèi)部項(xiàng)目組之間可以通過命名預(yù)定(比如加前綴等)解決這個(gè)問題,但是把視線放到整個(gè)軟件開發(fā)領(lǐng)域,在當(dāng)今協(xié)作開發(fā)相當(dāng)盛行的時(shí)代,這個(gè)問題卻依然存在。在使用多個(gè)第三方框架或類庫的時(shí)候,你唯一能作的就是祈禱它們的命名不要沖突,如果真正發(fā)生這種災(zāi)難的話,你唯一能作的就是放棄其中一個(gè)(注:可能是我孤陋寡聞,呵呵)。命名空間的引入相當(dāng)程度上解決了這個(gè)問題,當(dāng)然,如果你使用的命名空間和其他公司不幸一樣,而對(duì)方又是微軟、SUN等大佬,那恭喜你,呵呵@_@!
從事Web開發(fā)不可避免要接觸JavaScript,目前最新版本的JavaScript還是不支持命名空間,所以命名沖突的問題凸顯無疑,想象一下你引用了兩個(gè)js文件,卻發(fā)現(xiàn)由于命名問題導(dǎo)致你不得不放棄其中一個(gè),從而導(dǎo)致多寫了許多代碼,無疑是十分令人沮喪的。在JavaScript新版本引入命名空間概念之前,發(fā)揚(yáng)自立更生精神和創(chuàng)造性是我們程序員的基本義務(wù);-)
實(shí)現(xiàn)前提:與Delphi、C#等語言不同,JavaScript中的類并不是對(duì)象的定義,事實(shí)上JavaScript中并不存在真正的類,這里的類實(shí)際上是用函數(shù)模擬實(shí)現(xiàn)的,而JavaScript中的函數(shù)實(shí)際上是一個(gè)對(duì)象,因此在JavaScript中:一個(gè)類就是一個(gè)對(duì)象。這和傳統(tǒng)概念概念極為不同,在JavaScript中,創(chuàng)建某個(gè)類的實(shí)例實(shí)際上就是將類(=對(duì)象,記住)復(fù)制了一份??吹竭@里,有點(diǎn)設(shè)計(jì)模式概念的應(yīng)該就可以看出來了,在JavaScript中,類機(jī)制使用了原型(prototype)模式。
實(shí)現(xiàn)原理:既然看清楚了類的本質(zhì),那么問題就簡(jiǎn)單了,如果將GEA項(xiàng)目組所有JS類和函數(shù)作為屬性放在名為GEA的對(duì)象里面,然后將GEA對(duì)象以屬性的方式放在名為Grandsoft對(duì)象里面不就可以達(dá)到我們的目的,比如Grandsoft.GEA.Person實(shí)際上是在Grandsoft對(duì)象的屬性GEA(也是一個(gè)對(duì)象)中的類Person(還是一個(gè)對(duì)象)。
實(shí)現(xiàn)非常簡(jiǎn)單,整個(gè)命名空間機(jī)制的實(shí)現(xiàn)不超過20行代碼,分析如下:
// 聲明一個(gè)全局對(duì)象Namespace,用來注冊(cè)命名空間
在引入命名空間之前,一個(gè)令開發(fā)人員頭疼的問題就是如何防止函數(shù)名/類名和其他人的沖突,在一個(gè)公司內(nèi)部項(xiàng)目組之間可以通過命名預(yù)定(比如加前綴等)解決這個(gè)問題,但是把視線放到整個(gè)軟件開發(fā)領(lǐng)域,在當(dāng)今協(xié)作開發(fā)相當(dāng)盛行的時(shí)代,這個(gè)問題卻依然存在。在使用多個(gè)第三方框架或類庫的時(shí)候,你唯一能作的就是祈禱它們的命名不要沖突,如果真正發(fā)生這種災(zāi)難的話,你唯一能作的就是放棄其中一個(gè)(注:可能是我孤陋寡聞,呵呵)。命名空間的引入相當(dāng)程度上解決了這個(gè)問題,當(dāng)然,如果你使用的命名空間和其他公司不幸一樣,而對(duì)方又是微軟、SUN等大佬,那恭喜你,呵呵@_@!
從事Web開發(fā)不可避免要接觸JavaScript,目前最新版本的JavaScript還是不支持命名空間,所以命名沖突的問題凸顯無疑,想象一下你引用了兩個(gè)js文件,卻發(fā)現(xiàn)由于命名問題導(dǎo)致你不得不放棄其中一個(gè),從而導(dǎo)致多寫了許多代碼,無疑是十分令人沮喪的。在JavaScript新版本引入命名空間概念之前,發(fā)揚(yáng)自立更生精神和創(chuàng)造性是我們程序員的基本義務(wù);-)
實(shí)現(xiàn)前提:與Delphi、C#等語言不同,JavaScript中的類并不是對(duì)象的定義,事實(shí)上JavaScript中并不存在真正的類,這里的類實(shí)際上是用函數(shù)模擬實(shí)現(xiàn)的,而JavaScript中的函數(shù)實(shí)際上是一個(gè)對(duì)象,因此在JavaScript中:一個(gè)類就是一個(gè)對(duì)象。這和傳統(tǒng)概念概念極為不同,在JavaScript中,創(chuàng)建某個(gè)類的實(shí)例實(shí)際上就是將類(=對(duì)象,記住)復(fù)制了一份??吹竭@里,有點(diǎn)設(shè)計(jì)模式概念的應(yīng)該就可以看出來了,在JavaScript中,類機(jī)制使用了原型(prototype)模式。
實(shí)現(xiàn)原理:既然看清楚了類的本質(zhì),那么問題就簡(jiǎn)單了,如果將GEA項(xiàng)目組所有JS類和函數(shù)作為屬性放在名為GEA的對(duì)象里面,然后將GEA對(duì)象以屬性的方式放在名為Grandsoft對(duì)象里面不就可以達(dá)到我們的目的,比如Grandsoft.GEA.Person實(shí)際上是在Grandsoft對(duì)象的屬性GEA(也是一個(gè)對(duì)象)中的類Person(還是一個(gè)對(duì)象)。
實(shí)現(xiàn)非常簡(jiǎn)單,整個(gè)命名空間機(jī)制的實(shí)現(xiàn)不超過20行代碼,分析如下:
// 聲明一個(gè)全局對(duì)象Namespace,用來注冊(cè)命名空間
復(fù)制代碼 代碼如下:
Namespace = new Object();
// 全局對(duì)象僅僅存在register函數(shù),參數(shù)為名稱空間全路徑,如"Grandsoft.GEA"
Namespace.register = function(fullNS)
{
// 將命名空間切成N部分, 比如Grandsoft、GEA等
var nsArray = fullNS.split('.');
var sEval = "";
var sNS = "";
for (var i = 0; i < nsArray.length; i++)
{
if (i != 0) sNS += ".";
sNS += nsArray[i];
// 依次創(chuàng)建構(gòu)造命名空間對(duì)象(假如不存在的話)的語句
// 比如先創(chuàng)建Grandsoft,然后創(chuàng)建Grandsoft.GEA,依次下去
sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
}
if (sEval != "") eval(sEval);
}
上面就是在JavaScript中模擬命名空間機(jī)制的完整實(shí)現(xiàn),使用方式如下:
// 注冊(cè)命名空間Grandsoft.GEA, Grandsoft.GCM
Namespace.register("Grandsoft.GEA");
Namespace.register("Grandsoft.GCM");
// 在Grandsoft.GEA命名空間里面聲明類Person
Grandsoft.GEA.Person = function(name, age)
{
this.name = name;
this.age = age;
}
// 給類Person添加一個(gè)公共方法show()
Grandsoft.GEA.Person.prototype.show = function()
{
alert(this.name + " is " + this.age + " years old!");
}
// 演示如何使用類Person
var p = new Grandsoft.GEA.Person("yanglf", 25);
p.show();
哈哈,簡(jiǎn)單吧,這么簡(jiǎn)單的代碼我就不多說了,大家自己看著玩吧,其實(shí)我有點(diǎn)懶,呵呵@_@!!! // 全局對(duì)象僅僅存在register函數(shù),參數(shù)為名稱空間全路徑,如"Grandsoft.GEA"
Namespace.register = function(fullNS)
{
// 將命名空間切成N部分, 比如Grandsoft、GEA等
var nsArray = fullNS.split('.');
var sEval = "";
var sNS = "";
for (var i = 0; i < nsArray.length; i++)
{
if (i != 0) sNS += ".";
sNS += nsArray[i];
// 依次創(chuàng)建構(gòu)造命名空間對(duì)象(假如不存在的話)的語句
// 比如先創(chuàng)建Grandsoft,然后創(chuàng)建Grandsoft.GEA,依次下去
sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
}
if (sEval != "") eval(sEval);
}
上面就是在JavaScript中模擬命名空間機(jī)制的完整實(shí)現(xiàn),使用方式如下:
// 注冊(cè)命名空間Grandsoft.GEA, Grandsoft.GCM
Namespace.register("Grandsoft.GEA");
Namespace.register("Grandsoft.GCM");
// 在Grandsoft.GEA命名空間里面聲明類Person
Grandsoft.GEA.Person = function(name, age)
{
this.name = name;
this.age = age;
}
// 給類Person添加一個(gè)公共方法show()
Grandsoft.GEA.Person.prototype.show = function()
{
alert(this.name + " is " + this.age + " years old!");
}
// 演示如何使用類Person
var p = new Grandsoft.GEA.Person("yanglf", 25);
p.show();
相關(guān)文章
js數(shù)值計(jì)算時(shí)使用parseInt進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(jquery)
這篇文章主要介紹了js數(shù)值計(jì)算時(shí)使用parseInt進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(jquery),需要的朋友可以參考下2014-10-10layui操作列按鈕個(gè)數(shù)和文字顏色的判斷實(shí)例
今天小編就為大家分享一篇layui操作列按鈕個(gè)數(shù)和文字顏色的判斷實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09用nodejs實(shí)現(xiàn)PHP的print_r函數(shù)代碼
這篇文章主要介紹了用nodejs實(shí)現(xiàn)PHP的print_r函數(shù)代碼,需要的朋友可以參考下2014-03-03javascript中mouseenter與mouseover的異同
javascript中mouseover和mouseenter的區(qū)別主要在于監(jiān)聽對(duì)象的子元素是否觸發(fā)事件。mouseover:鼠標(biāo)移入監(jiān)聽對(duì)象中,或者從監(jiān)聽對(duì)象的一個(gè)子元素移入另一個(gè)子元素中時(shí)觸發(fā)該事件。mouseenter:鼠標(biāo)移入監(jiān)聽對(duì)象時(shí)觸發(fā),在監(jiān)聽對(duì)象內(nèi)移動(dòng)不會(huì)觸發(fā)。2017-06-06js 正則驗(yàn)證密碼強(qiáng)度(包含數(shù)字+特殊字符+英文字母大小寫)
密碼驗(yàn)證是常見的網(wǎng)站注冊(cè)方法,本文主要介紹了js 正則驗(yàn)證密碼強(qiáng)度(包含數(shù)字+特殊字符+英文字母大小寫),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01fastadmin如何讓后臺(tái)的日期顯示成年月日格式(推薦)
FastAdmin是一款基于ThinkPHP5+Bootstrap的極速后臺(tái)開發(fā)框架,本文給大家介紹fastadmin的后臺(tái)時(shí)間戳字段如何顯示成年月日的日期格式,感興趣的朋友跟隨小編一起看看吧2023-10-10