<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

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

    Posted on 2010-07-19 17:12 幻海藍夢 閱讀(11877) 評論(4)  編輯  收藏 所屬分類: JS
    原文:http://dev.firnow.com/course/3_program/java/javashl/20081128/152797.html
    ????
    引入命名空間之前,一個令開發人員頭疼的問題就是如何防止函數名/類名和其他人的沖突,在一個公司內部項目組之間可以通過命名預定(比如加前綴等)解決這個問題,但是把視線放到整個軟件開發領域,在當今協作開發相當盛行的時代,這個問題卻依然存在。在使用多個第三方框架或類庫的時候,你唯一能作的就是祈禱它們的命名不要沖突,如果真正發生這種災難的話,你唯一能作的就是放棄其中一個(注:可能是我孤陋寡聞,呵呵)。命名空間的引入相當程度上解決了這個問題,當然,如果你使用的命名空間和其他公司不幸一樣,而對方又是微軟、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();
    哈哈,簡單吧,這么簡單的代碼我就不多說了,大家自己看著玩吧,其實我有點懶,呵呵@_@!!!

    Feedback

    # re: JS--命名空間的理解(namespace)[未登錄]  回復  更多評論   

    2013-10-31 16:02 by a
    abc

    # re: JS--命名空間的理解(namespace)[未登錄]  回復  更多評論   

    2013-10-31 16:02 by a
    cde

    # re: JS--命名空間的理解(namespace)[未登錄]  回復  更多評論   

    2013-10-31 16:03 by a
    efg

    # re: JS--命名空間的理解(namespace)[未登錄]  回復  更多評論   

    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>
    主站蜘蛛池模板: 亚洲理论在线观看| 国产亚洲综合成人91精品| 手机看片国产免费永久| 国产精品四虎在线观看免费| 亚洲高清中文字幕免费| 最新仑乱免费视频| 亚洲hairy多毛pics大全| 好大好硬好爽免费视频| 亚洲中文字幕无码一久久区| 窝窝影视午夜看片免费| 免费观看的毛片大全| 亚洲一区爱区精品无码| 亚洲精品美女久久7777777| 日韩毛片无码永久免费看| 亚洲av日韩aⅴ无码色老头| 国产一区二区三区在线观看免费| 日韩欧美亚洲国产精品字幕久久久| 又粗又硬又黄又爽的免费视频| 色吊丝性永久免费看码 | 亚洲国产夜色在线观看| 毛片网站免费在线观看| 羞羞漫画小舞被黄漫免费| 亚色九九九全国免费视频| 国产亚洲福利在线视频| 亚洲福利中文字幕在线网址| 亚洲国产亚洲片在线观看播放| 成年丰满熟妇午夜免费视频| 全黄A免费一级毛片| 久久久久亚洲精品成人网小说| 黄页网址在线免费观看| 日本红怡院亚洲红怡院最新 | 亚洲av成人一区二区三区观看在线| 国产一卡二卡≡卡四卡免费乱码 | 久久久久成人片免费观看蜜芽| 亚洲一区动漫卡通在线播放| 国产v片免费播放| 免费精品无码AV片在线观看| 亚洲日韩一中文字暮| 国产情侣激情在线视频免费看| 国产亚洲人成在线播放| 亚洲AV无码码潮喷在线观看|