在JavaScript中實現命名空間

          Posted on 2007-05-03 15:34 sunbaby 閱讀(127) 評論(0)  編輯  收藏 所屬分類: 其它

          注:好久沒寫了,今天把我在公司內網寫的文章拷一份,出來露露臉,剛轉Web開發,所以開始學JavaScript!

          在引入命名空間之前,一個令開發人員頭疼的問題就是如何防止函數名/類名和其他人的沖突,在一個公司內部項目組之間可以通過命名預定(比如加前綴等)解決這個問題,但是把視線放到整個軟件開發領域,在當今協作開發相當盛行的時代,這個問題卻依然存在。在使用多個第三方框架或類庫的時候,你唯一能作的就是祈禱它們的命名不要沖突,如果真正發生這種災難的話,你唯一能作的就是放棄其中一個(注:可能是我孤陋寡聞,呵呵)。命名空間的引入相當程度上解決了這個問題,當然,如果你使用的命名空間和其他公司不幸一樣,而對方又是微軟、SUN等大佬,那恭喜你,呵呵@_@!

          從事Web開發不可避免要接觸JavaScript,目前最新版本的JavaScript還是不支持命名空間,所以命名沖突的問題凸顯無疑,想象一下你引用了兩個js文件,卻發現由于命名問題導致你不得不放棄其中一個,從而導致多寫了許多代碼,無疑是十分令人沮喪的。在JavaScript新版本引入命名空間概念之前,發揚自立更生精神和創造性是我們程序員的基本義務;-)

          實現前提:與Delphi、C#等語言不同,JavaScript中的類并不是對象的定義,事實上JavaScript中并不存在真正的類,這里的類實際上是用函數模擬實現的,而JavaScript中的函數實際上是一個對象,因此在JavaScript中:一個類就是一個對象。這和傳統概念概念極為不同,在JavaScript中,創建某個類的實例實際上就是將類(=對象,記?。椭屏艘环荨?吹竭@里,有點設計模式概念的應該就可以看出來了,在JavaScript中,類機制使用了原型(prototype)模式。

          實現原理:既然看清楚了類的本質,那么問題就簡單了,如果將GEA項目組所有JS類和函數作為屬性放在名為GEA的對象里面,然后將GEA對象以屬性的方式放在名為Grandsoft對象里面不就可以達到我們的目的,比如Grandsoft.GEA.Person實際上是在Grandsoft對象的屬性GEA(也是一個對象)中的類Person(還是一個對象)。

          實現非常簡單,整個命名空間機制的實現不超過20行代碼,分析如下:

          // 聲明一個全局對象Namespace,用來注冊命名空間
          Namespace = new Object();

          // 全局對象僅僅存在register函數,參數為名稱空間全路徑,如"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];
                  // 依次創建構造命名空間對象(假如不存在的話)的語句
                  // 比如先創建Grandsoft,然后創建Grandsoft.GEA,依次下去
                  sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
              }
              if (sEval != "") eval(sEval);
          }

          上面就是在JavaScript中模擬命名空間機制的完整實現,使用方式如下:

          // 注冊命名空間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添加一個公共方法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();
          哈哈,簡單吧,這么簡單的代碼我就不多說了,大家自己看著玩吧,其實我有點懶,呵呵@_@!!!


           

          posts - 2, comments - 2, trackbacks - 0, articles - 25

          Copyright © sunbaby

          free web counter
          free web counter 點擊發送消息給我
          主站蜘蛛池模板: 偃师市| 秭归县| 定边县| 东安县| 西贡区| 桐城市| 齐河县| 普兰店市| 潢川县| 温泉县| 武平县| 邹城市| 丹棱县| 拉萨市| 三河市| 涡阳县| 烟台市| 宣恩县| 峡江县| 固阳县| 洪洞县| 花莲县| 梓潼县| 邹城市| 岚皋县| 于都县| 轮台县| 谷城县| 长宁区| 阿克陶县| 确山县| 昭通市| 上犹县| 石楼县| 濮阳县| 株洲市| 惠州市| 华蓥市| 芦山县| 湖南省| 新田县|