乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JavaScript模擬命名空間

       WindySky 2009-07-02

      在C++和C#中,命名空間用于盡可能地減少名稱沖突。例如,在.NET Framework中,命名空間有助于將Microsoft.Build.Task.Message類與System.Messaging.Message區(qū)分開(kāi)來(lái)。JavaScript沒(méi)有任何特定語(yǔ)言功能來(lái)支持命名空間,但很容易使用對(duì)象來(lái)模擬命名空間。如果要?jiǎng)?chuàng)建一個(gè)JavaScript庫(kù),則可以將它們包裝在命名空間內(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");  

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

      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庫(kù)的源代碼,就會(huì)發(fā)現(xiàn)庫(kù)的作者使用了類似的技術(shù)來(lái)實(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 腳本等聲明性語(yǔ)法和參數(shù)驗(yàn)證所必需的),而且ASP.NET AJAX的目標(biāo)是將使用.NET的開(kāi)發(fā)人員所熟悉的某些其它構(gòu)造(例如屬、事件、枚舉和接口)轉(zhuǎn)換成JavaScript。

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

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

      類和反射

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

      ASP.NET AJAX中反射的API將檢查所有類型(無(wú)論是內(nèi)置類型、類、接口、命名空間或者甚至是枚舉),而它們包括的類似.NET Framework 的函數(shù)(例如 isInstanceOfType和inheritsFrom)可以在運(yùn)行時(shí)檢查類的層次結(jié)構(gòu)。ASP.NET AJAX 還會(huì)在調(diào)試模式下執(zhí)行某些類型檢查,這對(duì)開(kāi)發(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)購(gòu)買等信息,謹(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)論公約

        類似文章 更多