jasmine214--love

          只有當(dāng)你的內(nèi)心總是充滿快樂(lè)、美好的愿望和寧?kù)o時(shí),你才能擁有強(qiáng)壯的體魄和明朗、快樂(lè)或者寧?kù)o的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          JS--命名空間的理解(namespace)

          Posted on 2010-07-19 17:12 幻海藍(lán)夢(mèng) 閱讀(11879) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): JS
          原文:http://dev.firnow.com/course/3_program/java/javashl/20081128/152797.html
          ????
          引入命名空間之前,一個(gè)令開(kāi)發(fā)人員頭疼的問(wèn)題就是如何防止函數(shù)名/類(lèi)名和其他人的沖突,在一個(gè)公司內(nèi)部項(xiàng)目組之間可以通過(guò)命名預(yù)定(比如加前綴等)解決這個(gè)問(wèn)題,但是把視線放到整個(gè)軟件開(kāi)發(fā)領(lǐng)域,在當(dāng)今協(xié)作開(kāi)發(fā)相當(dāng)盛行的時(shí)代,這個(gè)問(wèn)題卻依然存在。在使用多個(gè)第三方框架或類(lèi)庫(kù)的時(shí)候,你唯一能作的就是祈禱它們的命名不要沖突,如果真正發(fā)生這種災(zāi)難的話,你唯一能作的就是放棄其中一個(gè)(注:可能是我孤陋寡聞,呵呵)。命名空間的引入相當(dāng)程度上解決了這個(gè)問(wèn)題,當(dāng)然,如果你使用的命名空間和其他公司不幸一樣,而對(duì)方又是微軟、SUN等大佬,那恭喜你,呵呵@_@!
          從事Web開(kāi)發(fā)不可避免要接觸JavaScript,目前最新版本的JavaScript還是不支持命名空間,所以命名沖突的問(wèn)題凸顯無(wú)疑,想象一下你引用了兩個(gè)js文件,卻發(fā)現(xiàn)由于命名問(wèn)題導(dǎo)致你不得不放棄其中一個(gè),從而導(dǎo)致多寫(xiě)了許多代碼,無(wú)疑是十分令人沮喪的。在JavaScript新版本引入命名空間概念之前,發(fā)揚(yáng)自立更生精神和創(chuàng)造性是我們程序員的基本義務(wù);-)
          實(shí)現(xiàn)前提:與Delphi、C#等語(yǔ)言不同,JavaScript中的類(lèi)并不是對(duì)象的定義,事實(shí)上JavaScript中并不存在真正的類(lèi),這里的類(lèi)實(shí)際上是用函數(shù)模擬實(shí)現(xiàn)的,而JavaScript中的函數(shù)實(shí)際上是一個(gè)對(duì)象,因此在JavaScript中:一個(gè)類(lèi)就是一個(gè)對(duì)象。這和傳統(tǒng)概念概念極為不同,在JavaScript中,創(chuàng)建某個(gè)類(lèi)的實(shí)例實(shí)際上就是將類(lèi)(=對(duì)象,記?。?fù)制了一份??吹竭@里,有點(diǎn)設(shè)計(jì)模式概念的應(yīng)該就可以看出來(lái)了,在JavaScript中,類(lèi)機(jī)制使用了原型(prototype)模式。
          實(shí)現(xiàn)原理:既然看清楚了類(lèi)的本質(zhì),那么問(wèn)題就簡(jiǎn)單了,如果將GEA項(xiàng)目組所有JS類(lèi)和函數(shù)作為屬性放在名為GEA的對(duì)象里面,然后將GEA對(duì)象以屬性的方式放在名為Grandsoft對(duì)象里面不就可以達(dá)到我們的目的,比如Grandsoft.GEA.Person實(shí)際上是在Grandsoft對(duì)象的屬性GEA(也是一個(gè)對(duì)象)中的類(lèi)Person(還是一個(gè)對(duì)象)。
          實(shí)現(xiàn)非常簡(jiǎn)單,整個(gè)命名空間機(jī)制的實(shí)現(xiàn)不超過(guò)20行代碼,分析如下:
          // 聲明一個(gè)全局對(duì)象Namespace,用來(lái)注冊(cè)命名空間
          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ì)象(假如不存在的話)的語(yǔ)句
          ??????? // 比如先創(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命名空間里面聲明類(lèi)Person
          Grandsoft.GEA.Person = function(name, age)
          {
          ??? this.name = name;
          ??? this.age = age;
          }
          // 給類(lèi)Person添加一個(gè)公共方法show()
          Grandsoft.GEA.Person.prototype.show = function()
          {
          ??? alert(this.name + " is " + this.age + " years old!");
          }
          // 演示如何使用類(lèi)Person
          var p = new Grandsoft.GEA.Person("yanglf", 25);
          p.show();
          哈哈,簡(jiǎn)單吧,這么簡(jiǎn)單的代碼我就不多說(shuō)了,大家自己看著玩吧,其實(shí)我有點(diǎn)懶,呵呵@_@!!!

          Feedback

          # re: JS--命名空間的理解(namespace)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-10-31 16:02 by a
          abc

          # re: JS--命名空間的理解(namespace)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-10-31 16:02 by a
          cde

          # re: JS--命名空間的理解(namespace)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-10-31 16:03 by a
          efg

          # re: JS--命名空間的理解(namespace)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-10-31 16:03 by a
          <html>
          <script>
          function ns(pkg){
          if(!pkg){
          return null;
          }
          var o={};
          var result=o;
          var arr=pkg.split('.');
          alert([arr[0]]);
          o=o[[arr[0]]]={};
          var len=arr.length;
          for(var i=1;i<len;i++){
          o=o[arr[i]]={};
          }
          return result;
          }
          var pkg=ns("com.momo.test");
          alert(pkg.com);
          </script>
          <body>
          hello world!
          </body>
          </html>
          主站蜘蛛池模板: 祁东县| 南投县| 闵行区| 禹州市| 临城县| 德昌县| 延吉市| 万盛区| 堆龙德庆县| 民勤县| 龙游县| 仙居县| 迁西县| 黄浦区| 洞口县| 社旗县| 米脂县| 海伦市| 高碑店市| 沙河市| 峨眉山市| 禹州市| 大姚县| 甘谷县| 万源市| 萝北县| 华宁县| 芜湖市| 咸宁市| 庆阳市| 深州市| 苏州市| 酒泉市| 育儿| 平阴县| 西充县| 醴陵市| 淅川县| 宁国市| 江都市| 阳曲县|