對 JavaScript 下 namespace 功能的簡單分析


前些天在剝離 百度隨心聽 的播放器引擎時,看到了一個namespace方法,
覺得新奇,當然只是對於我自己而言,我入門js不久,經驗尚淺。
之前看到網易還是新浪還是什么什么網站來着,也是用類似這種東西的,當時對js只是九牛一毛的水平,當場被嚇傻了。
但這次,我打算親自分析下,以后在看到就不會迷茫了。

//調用例子:bradio.namespace("bradio.lang.array");
//下面是百度編譯后的源碼,變量都是a,b,c,d...之后我會重新寫一個規范點的。
//好了,開始分析
bradio.namespace = function () { //創建命名空間
    var a = arguments, //["bradio.lang.array"]
        b = null, //用於存放上一級對象
        c, d, e, f; //c是計數器,d是內層循環的計數器,e是拆分后命名空間數組,f是arguments參數長度
    c = 0;
    for (f = a.length; c < f; c++) {
        e = ("" + a[c]).split("."); //拆分命名空間,拆分后 ["bradio", "lang", "array"]
        b = bradio; //基礎對象,基於這個對象進行命名空間的添加
        for (d = "bradio" == e[0] ? 1 : 0; d < e.length; d++) //如果第一個是bradio, 就第二個開始遍歷 ["bradio","lang","array"]
            b[e[d]] = b[e[d]] || {}, b = b[e[d]]
            //其實相當於
            //b[e[d]] = b[e[d]] || {} //如果當前對象已經操作就用當前對象,不存在就賦值空對象
            //b = b[e[d]] //用字對象覆蓋b,接下去的循環基於子對象添加命名空間
    }
    return b//返回最后一層對象
};

下面是整理后的,能看懂的版本

//bradio.namespace("bradio.lang.array");
bradio.namespace = function() { //創建命名空間
    var args = arguments,
        parent = null,
        arr, i, j, len;
    for (i = 0, len = args.length; i < len; i++) {
        arr = ("" + args[i]).split(".");
        parent = bradio;
        for (j = "bradio" == arr[0] ? 1 : 0; j < arr.length; j++) {
            parent[arr[j]] = parent[arr[j]] || {};
            parent = parent[arr[j]];
        }
    }
    return parent;
}

當然只是我的理解,如果哪里不是很對,還請各位大俠幫忙指出,以免誤導了大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM