Flash5 ActionScript高級(jí)編程指南(7)
發(fā)布時(shí)間:2008-08-14 閱讀數(shù): 次 來(lái)源:網(wǎng)樂原科技
三、自定義函數(shù)的運(yùn)用
2、函數(shù)語(yǔ)法的深入分析
精通面向?qū)ο笳Z(yǔ)言的朋友一看上面的語(yǔ)法說(shuō)明就一定會(huì)馬上產(chǎn)生這樣的感覺:有名函數(shù)在用作構(gòu)造函數(shù)時(shí)怎么那么別扭,既然已經(jīng)是構(gòu)造函數(shù)了,為什么對(duì)成員賦值還非得加上this?為對(duì)象加載方法又為什么必須要加上一個(gè)討厭的.prototype,而且看上去好象還非要用無(wú)名函數(shù)來(lái)定義。不忙,其實(shí)只要知道了其中的實(shí)現(xiàn)機(jī)理,這一切問題就雪融冰釋了。
第一點(diǎn)認(rèn)識(shí):所有的有名函數(shù)實(shí)現(xiàn)原理都一樣。不論是一般的函數(shù)也好,對(duì)象的構(gòu)造函數(shù)也好,它們?cè)谑褂脮r(shí)沒有任何區(qū)別。你完全可以用任何一個(gè)函數(shù)(包括系統(tǒng)預(yù)定義的函數(shù))通過new來(lái)構(gòu)造一個(gè)對(duì)象。比如下面這條語(yǔ)句在語(yǔ)法上是完全正確的:
a = new stop(); // stop是FAS中的系統(tǒng)指令函數(shù)
在此例中,你甚至還可以為stop“對(duì)象”加上方法:
stop.prototype.func = function() {return 1;} // 3.1式
a = new stop();
trace(a.func()); // 輸出 1
當(dāng)然,我們不提倡把系統(tǒng)預(yù)定義函數(shù)當(dāng)成構(gòu)造函數(shù)來(lái)用,只是想以此說(shuō)明所有的有名函數(shù)在語(yǔ)法上并沒有什么區(qū)別。
第二點(diǎn)認(rèn)識(shí):無(wú)名函數(shù)與有名函數(shù)之間的差別只是有沒有名字。這樣的提法似乎有點(diǎn)出乎意料,不過事實(shí)就是這樣。FAS里的函數(shù)名歸根結(jié)底也是和C語(yǔ)言中的一樣,是一個(gè)具有function類型的變量。你可以把它作為參數(shù)調(diào)用另一個(gè)函數(shù),比如系統(tǒng)對(duì)象Array中的sort方法就是這么做的:
myArray.sort(orderFunc); // orderFunc為一個(gè)比較函數(shù)的函數(shù)名
也可以把它賦值給其他的變量:
myFunc2 = myFunc1; // myFunc1為一個(gè)已定義的函數(shù)
這時(shí)對(duì)myFunc2的調(diào)用與對(duì)myFunc1的調(diào)用就完全相同了。但是無(wú)名函數(shù)由于沒有名字,所以只能通過把定義式直接賦值給某個(gè)變量(如3.1式)來(lái)實(shí)現(xiàn)其功能(有名函數(shù)不能如此賦值)。其他就沒有區(qū)別了(無(wú)名函數(shù)同樣也可以不賦值給某個(gè)變量,不過這樣的話就沒法調(diào)用它了,等于白寫)。由此可以看出,F(xiàn)AS中的function類型就相當(dāng)于C語(yǔ)言中的函數(shù)指針類型。