日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JavaScript模擬命名空間

 WindySky 2009-07-02

在C++和C#中,命名空間用于盡可能地減少名稱沖突。例如,在.NET Framework中,命名空間有助于將Microsoft.Build.Task.Message類與System.Messaging.Message區(qū)分開來。JavaScript沒有任何特定語言功能來支持命名空間,但很容易使用對(duì)象來模擬命名空間。如果要?jiǎng)?chuàng)建一個(gè)JavaScript庫,則可以將它們包裝在命名空間內(nèi),而不需要定義全局函數(shù)和類,如下所示:

Js代碼 復(fù)制代碼
  1. var MSDNMagNS.Pet = function(name)   
  2. {   
  3.         // code here;   
  4. };   
  5.   
  6. MSDNMagNs.Pet.prototype.toString = function()   
  7. {   
  8.         // code   
  9. };   
  10.   
  11. var pet = new MSDNMagNS.Pet("Yammer");  

 命名空間的一個(gè)級(jí)別可能不是唯一的,因此可以創(chuàng)建嵌套的命名空間:

Js代碼 復(fù)制代碼
  1. var MSDNMagNS = {};   
  2. // nested namespace "Examples"   
  3. MSDNMagNS.Examples = {};   
  4.   
  5. MSDNMagNS.Examples.Pet = function(name)   
  6. {   
  7.         // code   
  8. };   
  9.   
  10. MSDNMagNS.Examples.Pet.prototype.toString = function()   
  11. {   
  12.         // code   
  13. };   
  14.   
  15. var pet = new MSDNMagNS.Examples.Pet("Yammer");  

 可以想象,鍵入這些冗長的嵌套命名空間會(huì)讓人很累。幸運(yùn)的是,庫用戶可以很容易地為命名空間指定更短的別名:

Js代碼 復(fù)制代碼
  1. // MSDNMagNS.Examples and Pet definition...   
  2.   
  3. // think "using Eg = MSDNMagNS.Examples;"   
  4.   
  5. var Eg = MSDNMagNS.Examples;   
  6. var pet = new Eg.Pet("Yammer");   
  7. alert(pet);  

 如果看一下Microsoft Ajax庫的源代碼,就會(huì)發(fā)現(xiàn)庫的作者使用了類似的技術(shù)來實(shí)現(xiàn)命名空間(請(qǐng)參閱靜態(tài)方法Type.registerNamespace的實(shí)現(xiàn))。

OOP 和 ASP.NET AJAX

在ASP.NET AJAX中實(shí)現(xiàn)的OOP與在本文中討論的規(guī)范實(shí)現(xiàn)稍有不同,這主要有兩個(gè)原因:ASP.NET AJAX版本提供了更多反射可能性(它是諸如 xml 腳本等聲明性語法和參數(shù)驗(yàn)證所必需的),而且ASP.NET AJAX的目標(biāo)是將使用.NET的開發(fā)人員所熟悉的某些其它構(gòu)造(例如屬、事件、枚舉和接口)轉(zhuǎn)換成JavaScript。

在JavaScript當(dāng)前廣泛使用的版本中,它缺少.NET開發(fā)人員所熟悉的幾個(gè)OOP的關(guān)鍵概念,而ASP.NET AJAX可以模擬其中的大多數(shù)。

根據(jù)命名約定(要遵守的示例),類可以有屬性訪問器,以及多播事件(符合緊密反映由.NET提供的約定的模式)。私有變量遵守成員以下劃線開頭則為私有的約定。很少有機(jī)會(huì)用到真正的私有變量,此策略是為了使調(diào)試程序能夠監(jiān)測(cè)到這些變量。引入接口也是為了使類型檢查能夠避免常見的鴨子定型法(一種類型方案,它基于的概念是:如果有什么物體走路和叫聲像鴨子,那么它就是鴨子,或至少可以將它視為鴨子)。

類和反射

在JavaScript中,沒有辦法知道函數(shù)的名稱。即使這是可能的,但在大多數(shù)情況下也沒有什么用,因?yàn)轭悩?gòu)造函數(shù)通常是通過向命名空間變量分配匿名函數(shù)來構(gòu)造的。實(shí)際構(gòu)成類型名稱的是此變量的完全限定名稱,它同樣不可訪問,并且構(gòu)造函數(shù)本身對(duì)它一無所知。為了規(guī)避此限制,并使JavaScript類有豐富的反射,ASP.NET AJAX需要將類型名稱進(jìn)行注冊(cè)。

ASP.NET AJAX中反射的API將檢查所有類型(無論是內(nèi)置類型、類、接口、命名空間或者甚至是枚舉),而它們包括的類似.NET Framework 的函數(shù)(例如 isInstanceOfType和inheritsFrom)可以在運(yùn)行時(shí)檢查類的層次結(jié)構(gòu)。ASP.NET AJAX 還會(huì)在調(diào)試模式下執(zhí)行某些類型檢查,這對(duì)開發(fā)人員更早的捕獲Bug很有幫助。

注冊(cè)類層次結(jié)構(gòu)和調(diào)用基礎(chǔ)函數(shù)

若要在ASP.NET AJAX中定義類,您需要將其構(gòu)造函數(shù)賦給變量(注意,構(gòu)造函數(shù)如何調(diào)用舉出函數(shù)):

Js代碼 復(fù)制代碼
  1. MyNamespace.MyClass = function()   
  2. {   
  3.         MyNamespace.MyClass.initializeBase(this);   
  4.         this._myProperty = null;   
  5. }   
  6.   
  7. Then, you need to define the class members itself in its prototype:   
  8.   
  9. MyNamespace.MyClass.prototype =    
  10. {   
  11.         get_myProperty:function()   
  12.         {   
  13.                 return this._myProperty;   
  14.         },   
  15.         set_myProperty:function(value)   
  16.         {   
  17.                 this._myProperty = value;   
  18.         },   
  19.         doSomething: function()   
  20.         {   
  21.                 MyNamespace.MyClass.callBaseMethod(this,"doSomething");   
  22.                 /* do something more */  
  23.         }   
  24. }   
  25.   
  26. 最終注冊(cè)類:   
  27. MyNamespace.MyClass.registerClass("MyNamespace.MyClass", MyNamespace.BaseClass);   
  28.   
  29. 此處不需要管理構(gòu)造函數(shù)和原型層次結(jié)構(gòu),因?yàn)檫@由registerClass函數(shù)自動(dòng)完成。   
  30.   
  31. Bertrand Le Roy 是 ASP.NET AJAX 團(tuán)隊(duì)的軟件設(shè)計(jì)工程師 II。  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多