[推薦]在JavaScript中實現命名空間

來源:互聯網
上載者:User
註:好久沒寫了,今天把我在公司內網寫的文章拷一份,出來露露臉,剛轉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();

  哈哈,簡單吧,這麼簡單的代碼我就不多說了,大家自己看著玩吧,其實我有點懶,呵呵@_@!!!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.