在C++和C#中,命名空間用于盡可能地減少名稱沖突。例如,在.NET Framework中,命名空間有助于將Microsoft.Build.Task.Message類與System.Messaging.Message區(qū)分開來。JavaScript沒有任何特定語言功能來支持命名空間,但很容易使用對(duì)象來模擬命名空間。如果要?jiǎng)?chuàng)建一個(gè)JavaScript庫,則可以將它們包裝在命名空間內(nèi),而不需要定義全局函數(shù)和類,如下所示:
var MSDNMagNS.Pet = function(name) { // code here; }; MSDNMagNs.Pet.prototype.toString = function() { // code }; var pet = new MSDNMagNS.Pet("Yammer"); 命名空間的一個(gè)級(jí)別可能不是唯一的,因此可以創(chuàng)建嵌套的命名空間:
var MSDNMagNS = {}; // nested namespace "Examples" MSDNMagNS.Examples = {}; MSDNMagNS.Examples.Pet = function(name) { // code }; MSDNMagNS.Examples.Pet.prototype.toString = function() { // code }; var pet = new MSDNMagNS.Examples.Pet("Yammer"); 可以想象,鍵入這些冗長的嵌套命名空間會(huì)讓人很累。幸運(yùn)的是,庫用戶可以很容易地為命名空間指定更短的別名:
// MSDNMagNS.Examples and Pet definition... // think "using Eg = MSDNMagNS.Examples;" var Eg = MSDNMagNS.Examples; var pet = new Eg.Pet("Yammer"); 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ù)):
|
|