国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【譯】JavaScript 命名空間

liujs / 1191人閱讀

摘要:前綴命名空間如果命名空間的目的是避免沖突的話。語(yǔ)言程序經(jīng)常使用前綴命名空間。我認(rèn)為前綴命名空間是中最清楚明白的命名空間系統(tǒng)。對(duì)象命名空間的一個(gè)問(wèn)題是它會(huì)導(dǎo)致與面向?qū)ο笙鬟f混淆。嵌套命名空間的幻覺(jué)在中也存在。

原文鏈接:《JavaScript Namespacing》
譯文原鏈:【譯】JavaScript 命名空間

JavaScript 中有很多可以給你的對(duì)象安全分配命名空間的方法。這篇文章討論我見(jiàn)過(guò)的普遍的實(shí)踐。

前綴命名空間

如果命名空間的目的是避免沖突的話。下面這個(gè)系統(tǒng),只要我們知道全局變量名前綴 myApp_ 是唯一的,可以像其他系統(tǒng)一樣避免命名空間沖突。

// add uniquely named global properties
var myApp_sayHello = function() {
  alert("hello");
};
var myApp_sayGoodbye = function() {
  alert("goodbye");
};

// use the namespace properties
myApp_sayHello();

C 語(yǔ)言程序經(jīng)常使用前綴命名空間。在 JavaScript 的世界中,你可能會(huì)碰見(jiàn) Macromedia 的 MM_ 方法,例如 MM_showHideLayers。

我認(rèn)為前綴命名空間是 JavaScript 中最清楚明白的命名空間系統(tǒng)。(下面的對(duì)象命名空間策略在加入了 this 關(guān)鍵字后會(huì)導(dǎo)致困惑。)

前綴命名空間的確創(chuàng)建了很多全局對(duì)象。這對(duì)于前綴用來(lái)避免的命名空間沖突并不是什么問(wèn)題。前綴命名空間的問(wèn)題是,有些網(wǎng)頁(yè)瀏覽器(例如 IE6)在有很多全局對(duì)象時(shí)表現(xiàn)很糟糕,就我所聽(tīng)說(shuō)。我做了一些測(cè)試并且發(fā)現(xiàn)有一個(gè) comp.lang.javascript 的小線程,不過(guò)我沒(méi)有就這個(gè)話題研究徹底。

單對(duì)象命名空間

當(dāng)下,最流行的 JavaScript 命名空間實(shí)踐是使用一個(gè)全局變量來(lái)引用一個(gè)對(duì)象。這個(gè)被引用的對(duì)象引用你的『真正的業(yè)務(wù)』,并且因?yàn)槟愕娜謱?duì)象的命名獨(dú)一無(wú)二,你的代碼和其他人的代碼就可以一起嗨皮地運(yùn)行。

如果你確定這個(gè)世界上沒(méi)有任何人用了這個(gè)全局變量名 myApp,那么你可以有這樣的代碼:

// define the namespace object
var myApp = {};

// add properties to the namespace object
myApp.sayHello = function() {
  alert("hello");
};
myApp.sayGoodbye = function() {
  alert("goodbye");
};

// use the namespace properties
myApp.sayHello();

當(dāng)上面代碼的最后一行執(zhí)行時(shí),JavaScript 解釋器首先找到 myApp 對(duì)象,然后找到并調(diào)用這個(gè)對(duì)象的 syaHello 屬性。

對(duì)象命名空間的一個(gè)問(wèn)題是它會(huì)導(dǎo)致與面向?qū)ο笙鬟f混淆。這兩者之間并沒(méi)有明顯的句法差異:

// 1
namespace.prop();

// 2
receiver.message();

更仔細(xì)地研究這個(gè)混淆,我們得出下面的命名空間想法。假設(shè)我們有以下庫(kù)。

var myApp = {};

myApp.message = "hello";

myApp.sayHello = function() {
  alert(myApp.message);
};

用這個(gè)庫(kù)的代碼可以隨意進(jìn)行寫操作。

myApp.sayHello(); // works
  
var importedfn = myApp.sayHello;

importedfn(); // works

將這個(gè)和那個(gè)令人混淆的使用 this 的消息傳遞版本比較一下。

var myApp = {};

myApp.message = "hello";

myApp.sayHello = function() {
  alert(this.message);
};

用這個(gè)庫(kù)的代碼可以隨意進(jìn)行寫操作。

myApp.sayHello() // works because "this" refers to myApp object.

var importedfn = myApp.sayHello;

importedfn(); // error because "this" refers to global object.

這里面的要上的一課是,this 永遠(yuǎn)不能引用一個(gè)被作為命名空間的對(duì)象因?yàn)樗夏軐?dǎo)致關(guān)于從命名空間引入標(biāo)識(shí)符的混淆。這個(gè)問(wèn)題是 this 在我的 JavaScript Warning Words 列表中的原因之一。

(這也表明了庫(kù)的 API 屬性應(yīng)該指向用一個(gè)方法,這樣這些方法可以被導(dǎo)入其他命名空間。這個(gè)問(wèn)題是在我的文章 Lazy Function Definition Pattern 的評(píng)論中被指出的。懶惰方法定義可以在被隱藏在庫(kù)中并且不是 API 的部分時(shí)安全使用。)

嵌套對(duì)象命名空間

嵌套對(duì)象命名空間是另一個(gè)普遍的實(shí)踐,它擴(kuò)展了對(duì)象命名空間的想法。你可能見(jiàn)過(guò)類似如下代碼:

YAHOO.util.Event.addListener(/*...*/)

解決上面的代碼需要解釋器首先找到全聚德 YAHOO 對(duì)象,然后它的 util 對(duì)象,然后它的 Event 對(duì)象,然后找到并調(diào)用它的 addListener 屬性。這樣的話每次事件處理器綁定到一個(gè) DOM 元素上花的功夫太多了,因此導(dǎo)入的概念開(kāi)始被采用。

(function() {
  var yue = YAHOO.util.Event;
  yue.addListener(/*...*/);
  yue.addListener(/*...*/);
})();

如果你清楚 YAHOO.util.Event.addListener 方法不會(huì)用 this 關(guān)鍵字并且永遠(yuǎn)引用同一個(gè)方法,那么導(dǎo)入可以變得更加簡(jiǎn)潔。

(function() {
  var yuea = YAHOO.util.Event.addEventListener;
  yuea(/*...*/);
  yuea(/*...*/);
})();

我覺(jué)得當(dāng)目的只是避免標(biāo)識(shí)符沖突時(shí),嵌套對(duì)象命名空間的復(fù)雜是不必要的。難道 Yahoo! 還覺(jué)得這些全局標(biāo)識(shí)符 YAHOO_util_Event 和 YAHOO_util_Event_addEventListener 不夠獨(dú)特嗎?

我認(rèn)為使用嵌套對(duì)象命名空間的動(dòng)機(jī)是要看起來(lái)和 Java 包命名傳統(tǒng)一樣,這在 Java 中開(kāi)銷不大。例如,在 Java 中你可能看到如下:

package mytools.text;

class TextComponent {
  /* ... */
}

一個(gè)這個(gè)類的完全合格的引用應(yīng)該是 mytools.text.TextComponent

下面是 Niemeyer 和 Knudsen (寫)的 Learning Java 中包命名的描述:

包名是按層級(jí)構(gòu)成的,使用點(diǎn)分隔的命名傳統(tǒng)。包名組成成分給編譯器和運(yùn)行系統(tǒng)構(gòu)成了獨(dú)一無(wú)二的定位文件的路徑。然而,它們并沒(méi)在包之間創(chuàng)建其他的關(guān)系。并沒(méi)有什么『subpackage』的說(shuō)法,事實(shí)上,包命名空間是直接的,而非層級(jí)的。在包層級(jí)關(guān)系特定部分的包僅僅是因?yàn)榱?xí)慣而有關(guān)聯(lián)。比如,如果我們穿件了另一個(gè)叫做 mytools.text.poetry 的包(假設(shè)是為了跟詩(shī)有關(guān)的一些文字類),這些類并不是 mytools.text 包的一部分;它們沒(méi)有包成員的訪問(wèn)權(quán)限。

嵌套命名空間的幻覺(jué)在 Perl 中也存在。在 Perl 中,嵌套包名由雙冒號(hào)分隔開(kāi)。你可以看到如下 Perl 代碼:

package Red::Blue;
our $var = "foo";

一個(gè)完全合格的上述變量引用應(yīng)該是 $Red::Blue::var

在 Perl 中,就像 Java,命名空間層級(jí)的主意只是方便程序員,而不是語(yǔ)言本身要求。Wall,Christiansen 和 Orwant 的 Programming Perl 解釋道:

雙冒號(hào)可被用于鏈接在包名 $Red::Blue::var 中標(biāo)識(shí)符。這意味著 $var 屬于包 Red::Blue。包 Red::Blue 跟可能存在的 Red 包或 Blue 包一點(diǎn)關(guān)系都沒(méi)有。只是說(shuō),Red::BlueRed 或者 Blue 之間的關(guān)系可能對(duì)于寫代碼或者使用這個(gè)程序的人有什么意義,但跟 Perl 沒(méi)關(guān)系。(好吧,除了在現(xiàn)在的實(shí)現(xiàn)中,符號(hào)表 Red::Blue 剛好存在符號(hào)表 Red 中。但是 Perl 語(yǔ)言并沒(méi)有直接利用過(guò)它。)

上述引用中最后備注暗示了 Perl 可能有和在 JavaScript 中使用嵌套命名空間對(duì)象一樣的標(biāo)識(shí)符沖突開(kāi)銷。如果 Perl 的實(shí)現(xiàn)改變了,這個(gè)開(kāi)銷就會(huì)消失。在 JavaScript 中,我肯定嵌套對(duì)象命名空間的開(kāi)銷永遠(yuǎn)不會(huì)消失因?yàn)?JavaScript 使用延遲綁定。

我并不認(rèn)為 JavaScript 中的嵌套對(duì)象命名空間提供了任何大好處,不過(guò)如果不使用導(dǎo)入的話在運(yùn)行時(shí)可能會(huì)開(kāi)銷非常大。

一個(gè)折中方案

如果單純地前綴命名空間在某些瀏覽器中真的很慢,而嵌套命名空間的概念幫助在開(kāi)發(fā)者腦中保持各事務(wù)的有序,那我認(rèn)為上述 Yahoo! 的例子也可以這樣寫:

YAHOO.util_Event_addListener

或者用更多的全局名稱:

YAHOO_util_Event.addListener
哪個(gè)維度的命名空間?

Perl 的 CPAN 模塊是基于他們所做的事情進(jìn)行命名空間管理的。例如,我寫了一個(gè)這個(gè)命名空間里的模塊:

JavaScript::Minifier

如果別人用同樣的名字寫他自己的模塊,并且他不自知地通過(guò)某些模塊依賴通過(guò)同一個(gè)名字使用 CPAN 模塊,那么就會(huì)有沖突。

Java 程序員采用最冗長(zhǎng)但當(dāng)然也是最安全的方法。(Java 程序員似乎都想著在大型系統(tǒng)上運(yùn)行的代碼。)在 Java 中,包經(jīng)常是基于誰(shuí)寫的做什么的來(lái)命名。(myFunc風(fēng)格的規(guī)范化。)『誰(shuí)寫的』部分甚至使用開(kāi)發(fā)者自己的相對(duì)可以保證唯一性的名字。如果我寫一個(gè) Java 的 minifier,因?yàn)槲矣?michaux.ca 的域名,我可能用以下命名空間:

ca.michaux.javascript.minifier

在 JavaScript 中,經(jīng)過(guò)這次討論,可能這樣寫效率更高:

ca_michaux_javascript_minifier

因?yàn)?JavaScript 是以文本的形式服務(wù)的,這樣的命名空間可能開(kāi)銷太大,因?yàn)樵黾恿讼螺d時(shí)間。Gzip 壓縮會(huì)找到公共的字符串并用短字符串替換它們。如果 gzip 不可用的話那么就可以考慮使用導(dǎo)入了。

var ca_michaux_javascript_minifier = {};

(function() {
  var cmjm = ca_michaux_javascript_minifier;
  
  // refer to cmjm inside this module pattern
})();

我并不是說(shuō)這些長(zhǎng)的命名空間是絕對(duì)必須的,不過(guò)他們一定是避免命名空間沖突的最安全方法。

其他命名空間問(wèn)題

標(biāo)識(shí)符不僅在 JavaScript 資源中創(chuàng)建。一個(gè)表單的 name 屬性也被加在 document.forms 對(duì)象上。像

這樣命名是有意義的。

命名空間類名屬性,比如

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/79812.html

相關(guān)文章

  • JavaScript 中的命名空間

    摘要:原文鏈接譯文原鏈譯中的命名空間全局變量應(yīng)該由有系統(tǒng)范圍相關(guān)性的對(duì)象們保留,并且它們的命名應(yīng)該避免含糊并盡量減少命名沖突的風(fēng)險(xiǎn)。其他的考慮我希望避免命名空間嵌套。因?yàn)椴](méi)有正式的命名空間結(jié)構(gòu),所以有很多自然形成的方法。 原文鏈接: Namespacing in JavaScript譯文原鏈: 【譯】JavaScript 中的命名空間 全局變量應(yīng)該由有系統(tǒng)范圍相關(guān)性的對(duì)象們保留,并且它們的...

    Crazy_Coder 評(píng)論0 收藏0
  • [] 你想知道的關(guān)于 JavaScript 作用域的一切

    摘要:原文鏈接原文作者你想知道的關(guān)于作用域的一切譯中有許多章節(jié)是關(guān)于的但是對(duì)于初學(xué)者來(lái)說(shuō)甚至是一些有經(jīng)驗(yàn)的開(kāi)發(fā)者這些有關(guān)作用域的章節(jié)既不直接也不容易理解這篇文章的目的就是為了幫助那些想更深一步學(xué)習(xí)了解作用域的開(kāi)發(fā)者尤其是當(dāng)他們聽(tīng)到一些關(guān)于作用域的 原文鏈接: Everything you wanted to know about JavaScript scope原文作者: Todd Mott...

    Flands 評(píng)論0 收藏0
  • 】《精通使用AngularJS開(kāi)發(fā)Web App》(三)--- 深入scope,繼承結(jié)構(gòu),事件系

    摘要:比如,我們可以監(jiān)聽(tīng)事件由實(shí)例發(fā)出,然后在任何瀏覽器中就是變化的時(shí)候都會(huì)得到通知,如下所示每一個(gè)作用域?qū)ο蠖紩?huì)有這個(gè)方法,可以用來(lái)注冊(cè)一個(gè)作用域事件的偵聽(tīng)器。這個(gè)函數(shù)所扮演的偵聽(tīng)器在被調(diào)用時(shí)會(huì)有一個(gè)對(duì)象作為第一個(gè)參數(shù)。 上一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(二) 下一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(四) 書名:Mastering W...

    wind5o 評(píng)論0 收藏0
  • []谷歌 HTML/CSS 規(guī)范

    摘要:通用格式規(guī)范縮進(jìn)一次縮進(jìn)個(gè)空格,不要使用或者混合和空格的縮進(jìn)。語(yǔ)義化根據(jù)使用場(chǎng)景選擇正確的元素有時(shí)被錯(cuò)誤的稱為標(biāo)簽。格式規(guī)范引號(hào)屬性值用雙引號(hào)。風(fēng)格規(guī)范和命名使用有含義的和名稱。和單位值為時(shí)不用添加單位。 原文 Google HTML/CSS Style Guide 背景 這篇文章定義了 HTML 和 CSS 的格式和代碼規(guī)范,旨在提高代碼質(zhì)量和協(xié)作效率。 通用樣式規(guī)范 協(xié)議 圖片,樣...

    seasonley 評(píng)論0 收藏0
  • []谷歌 HTML/CSS 規(guī)范

    摘要:通用格式規(guī)范縮進(jìn)一次縮進(jìn)個(gè)空格,不要使用或者混合和空格的縮進(jìn)。語(yǔ)義化根據(jù)使用場(chǎng)景選擇正確的元素有時(shí)被錯(cuò)誤的稱為標(biāo)簽。格式規(guī)范引號(hào)屬性值用雙引號(hào)。風(fēng)格規(guī)范和命名使用有含義的和名稱。和單位值為時(shí)不用添加單位。 原文 Google HTML/CSS Style Guide 背景 這篇文章定義了 HTML 和 CSS 的格式和代碼規(guī)范,旨在提高代碼質(zhì)量和協(xié)作效率。 通用樣式規(guī)范 協(xié)議 圖片,樣...

    whinc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<