奇妙的對象
先來說說函數(shù)的對象化能力。
任何一個函數(shù)都可以為其動態(tài)地添加或去除屬性,這些屬性可以是簡單類型,可以是對象,也可以是其他函數(shù)。也就是說,函數(shù)具有對象的全部特征,你完全可以把函數(shù)當對象來用。其實,函數(shù)就是對象,只不過比一般的對象多了一個括號“()”操作符,這個操作符用來執(zhí)行函數(shù)的邏輯。即,函數(shù)本身還可以被調用,一般對象卻不可以被調用,除此之外完全相同。請看下面的代碼:
function Sing() { with(arguments.callee) alert(author + ":" + poem); }; Sing.author = "李白"; Sing.poem = "漢家秦地月,流影照明妃。一上玉關道,天涯去不歸"; Sing(); Sing.author = "李戰(zhàn)"; Sing.poem = "日出漢家天,月落陰山前。女兒琵琶怨,已唱三千年"; Sing();
在這段代碼中,Sing函數(shù)被定義后,又給Sing函數(shù)動態(tài)地增加了author和poem屬性。將author和poem屬性設為不同的作者和詩句,在調用Sing()時就能顯示出不同的結果。這個示例用一種詩情畫意的方式,讓我們理解了JavaScript函數(shù)就是對象的本質,也感受到了JavaScript語言的優(yōu)美。
好了,以上的講述,我們應該算理解了function類型的東西都是和object類型一樣的東西,這種東西被我們稱為“對象”。我們的確可以這樣去看待這些“對象”,因為它們既有“屬性”也有“方法”嘛。但下面的代碼又會讓我們產生新的疑惑:
var anObject = {}; //一個對象 anObject.aProperty = "Property of object"; //對象的一個屬性 anObject.aMethod = function(){alert("Method of object")}; //對象的一個方法 //主要看下面: alert(anObject["aProperty"]); //可以將對象當數(shù)組以屬性名作為下標來訪問屬性 anObject["aMethod"](); //可以將對象當數(shù)組以方法名作為下標來調用方法 for( var s in anObject) //遍歷對象的所有屬性和方法進行迭代化處理 alert(s + " is a " + typeof(anObject[s])); 同樣對于function類型的對象也是一樣: var aFunction = function() {}; //一個函數(shù) aFunction.aProperty = "Property of function"; //函數(shù)的一個屬性 aFunction.aMethod = function(){alert("Method of function")}; //函數(shù)的一個方法 //主要看下面: alert(aFunction["aProperty"]); //可以將函數(shù)當數(shù)組以屬性名作為下標來訪問屬性 aFunction["aMethod"](); //可以將函數(shù)當數(shù)組以方法名作為下標來調用方法 for( var s in aFunction) //遍歷函數(shù)的所有屬性和方法進行迭代化處理 alert(s + " is a " + typeof(aFunction[s]));
是的,對象和函數(shù)可以象數(shù)組一樣,用屬性名或方法名作為下標來訪問并處理。那么,它到底應該算是數(shù)組呢,還是算對象?
我們知道,數(shù)組應該算是線性數(shù)據(jù)結構,線性數(shù)據(jù)結構一般有一定的規(guī)律,適合進行統(tǒng)一的批量迭代操作等,有點像波。而對象是離散數(shù)據(jù)結構,適合描述分散的和個性化的東西,有點像粒子。因此,我們也可以這樣問:JavaScript里的對象到底是波還是粒子?
如果存在對象量子論,那么答案一定是:波粒二象性!
因此,JavaScript里的函數(shù)和對象既有對象的特征也有數(shù)組的特征。這里的數(shù)組被稱為“字典”,一種可以任意伸縮的名稱值對兒的集合。其實, object和function的內部實現(xiàn)就是一個字典結構,但這種字典結構卻通過嚴謹而精巧的語法表現(xiàn)出了豐富的外觀。正如量子力學在一些地方用粒子來解釋和處理問題,而在另一些地方卻用波來解釋和處理問題。你也可以在需要的時候,自由選擇用對象還是數(shù)組來解釋和處理問題。只要善于把握JavaScript的這些奇妙特性,就可以編寫出很多簡潔而強大的代碼來。
出處:軟件真諦
責任編輯:moby
上一頁 函數(shù)的魔力 下一頁 放下對象
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|