小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JavaScript模擬命名空間

 WindySky 2009-07-02

在C++和C#中,命名空間用于盡可能地減少名稱沖突。例如,在.NET Framework中,命名空間有助于將Microsoft.Build.Task.Message類與System.Messaging.Message區(qū)分開來。JavaScript沒有任何特定語言功能來支持命名空間,但很容易使用對象來模擬命名空間。如果要創(chuàng)建一個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");  

 命名空間的一個級別可能不是唯一的,因此可以創(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");  

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

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庫的源代碼,就會發(fā)現(xiàn)庫的作者使用了類似的技術(shù)來實現(xiàn)命名空間(請參閱靜態(tài)方法Type.registerNamespace的實現(xiàn))。

OOP 和 ASP.NET AJAX

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

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

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

類和反射

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

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

注冊類層次結(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. 最終注冊類:   
  27. MyNamespace.MyClass.registerClass("MyNamespace.MyClass", MyNamespace.BaseClass);   
  28.   
  29. 此處不需要管理構(gòu)造函數(shù)和原型層次結(jié)構(gòu),因為這由registerClass函數(shù)自動完成。   
  30.   
  31. Bertrand Le Roy 是 ASP.NET AJAX 團隊的軟件設(shè)計工程師 II。  

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多