JavaScript命名空間

JavaScript由于不像其他OO語(yǔ)言那樣有namespace,所有全局變量(不管是有意還是無(wú)意)都會(huì)被添加到window對(duì)象里糙及。這樣既容易造成命名沖突模孩,還不便于管理。本篇就介紹一下JavaScript中如何實(shí)現(xiàn)命名空間namespace简肴。

首先你需要確定一下按什么規(guī)則定義命名空間晃听,通常會(huì)按項(xiàng)目名或功能名來(lái)分配命名空間。例如我司開(kāi)發(fā)的X控件庫(kù)砰识,所有對(duì)象就掛在全局變量X下:

var X = {};
X.xButton = {};
…
X.xInputField = {};

X變量作為根變量能扒,底下各控件,如按鈕使用X.xButton辫狼,文本框用X.xInputField初斑,這樣團(tuán)隊(duì)可以放心大膽地為自己開(kāi)發(fā)的控件定義屬性和方法,或調(diào)用他人開(kāi)發(fā)的控件代碼膨处,而不必?fù)?dān)心命名沖突见秤。類(lèi)似地jQuery庫(kù)都掛在jQuery對(duì)象下,Yahoo庫(kù)都掛在Y對(duì)象下灵迫,這樣可以即便于管理秦叛,也防止了命名污染。

如果你就一個(gè)文件瀑粥,上面這樣就夠了挣跋。但通常項(xiàng)目不止一個(gè)文件,尤其是引入多個(gè)庫(kù)時(shí)狞换,要保證多個(gè)庫(kù)的根命名空間不沖突避咆。即便是同一個(gè)庫(kù),有多個(gè)文件的話修噪,也要保證多文件內(nèi)定義的子命名空間不沖突查库。

先看避免多個(gè)庫(kù)的根命名空間沖突(雖然概率可能比較小)黄琼。

例如jQuery里$對(duì)象是jQuery對(duì)象的別名樊销,但如果其他庫(kù)也用$對(duì)象,就會(huì)發(fā)生沖突脏款。別看現(xiàn)在jQuery牛bi哄哄围苫,早期jQuery剛推出時(shí)心也是很虛的,因此jQeruy提供了noConflict方法可以讓渡根對(duì)象$的控制權(quán)撤师。

例如下面3個(gè)例子:直接放棄$剂府,將$改名,將$移到一個(gè)新的命名空間下

//直接放棄$
jQuery.noConflict();
jQuery("p").hide();         //使用 jQuery的代碼
$("content").style.display = "none";    //使用其他庫(kù)的 $()

//將$改名
var j = jQuery.noConflict();
j("p").hide();              //使用 jQuery的代碼
$("content").style.display = "none";    //使用其他庫(kù)的 $()

//將$移到一個(gè)新的命名空間下
var newQuery = {};
newQuery.$ = jQuery.noConflict(true);
newQuery.$("div.aa").css("background-color","red"); //使用 jQuery的代碼
$("div.aa").css("background-color","blue");         //使用其他庫(kù)的 $()

當(dāng)然關(guān)于noConflict更多例子請(qǐng)自行查閱jQuery官網(wǎng)剃盾。

再看避免同一個(gè)庫(kù)內(nèi)多個(gè)子命名空間的沖突腺占。通秤偻啵可以自定義一個(gè)生成命名空間的函數(shù),將命名空間傳入并進(jìn)行檢查衰伯,沒(méi)有就新建铡羡,有了就沿用:

var X = {
    namespace: function(ns) {   //將命名空間傳入該方法進(jìn)行檢查
        var parts = ns.split("."),
            object = this, i, len;

        for(i = 0, len = parts.length; i < len; i++) {
            if (typeof object[parts[i]] === "undefined") {
                object[parts[i]] = {};  //沒(méi)有就新建
            }
            object = object[parts[i]];
        }
        return object;
    }
}
X.namespace("xButton.widget");
X.namespace("xInputField.widget ");

X.xButton.widget = …
X.xInputField.widget = …

根據(jù)功能劃分的各文件,都調(diào)用自定義的namespace方法來(lái)聲明需要的命名空間嚎研,開(kāi)發(fā)者就不必?fù)?dān)心命名空間沖突的問(wèn)題了蓖墅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市临扮,隨后出現(xiàn)的幾起案子论矾,更是在濱河造成了極大的恐慌,老刑警劉巖杆勇,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪壳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚜退,警方通過(guò)查閱死者的電腦和手機(jī)闰靴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钻注,“玉大人蚂且,你說(shuō)我怎么就攤上這事》担” “怎么了杏死?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捆交。 經(jīng)常有香客問(wèn)我淑翼,道長(zhǎng),這世上最難降的妖魔是什么品追? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任玄括,我火速辦了婚禮,結(jié)果婚禮上肉瓦,老公的妹妹穿的比我還像新娘遭京。我一直安慰自己,他們只是感情好泞莉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布洁墙。 她就那樣靜靜地躺著,像睡著了一般戒财。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捺弦,一...
    開(kāi)封第一講書(shū)人閱讀 50,021評(píng)論 1 291
  • 那天饮寞,我揣著相機(jī)與錄音孝扛,去河邊找鬼。 笑死幽崩,一個(gè)胖子當(dāng)著我的面吹牛苦始,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慌申,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陌选,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蹄溉?” 一聲冷哼從身側(cè)響起咨油,我...
    開(kāi)封第一講書(shū)人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柒爵,沒(méi)想到半個(gè)月后役电,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棉胀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年法瑟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唁奢。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霎挟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麻掸,到底是詐尸還是另有隱情酥夭,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布论笔,位于F島的核電站采郎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狂魔。R本人自食惡果不足惜蒜埋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望最楷。 院中可真熱鬧整份,春花似錦、人聲如沸籽孙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)犯建。三九已至讲冠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間适瓦,已是汗流浹背竿开。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工谱仪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人否彩。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓疯攒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親列荔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敬尺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 一、 為什么需要命名空間(問(wèn)題提出) 命名空間是ANSIC++引入的可以由用戶命名的作用域贴浙,用來(lái)處理程序中 常見(jiàn)的...
    IvanRunning閱讀 2,355評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理砂吞,服務(wù)發(fā)現(xiàn),斷路器悬而,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,851評(píng)論 25 707
  • 《裕語(yǔ)言》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 26,308評(píng)論 5 19
  • 你 是流星 是星系 或是太陽(yáng)之子 你 只愛(ài)太陽(yáng)的果實(shí) 這金色的麥田和燦爛的向日葵 沒(méi)有人 去探究你短暫的活的靈魂 ...
    木進(jìn)閱讀 702評(píng)論 3 4