Flash5 ActionScript高級編程指南(9)
發(fā)布時(shí)間:2008-08-14 閱讀數(shù): 次 來源:網(wǎng)樂原科技
三、自定義函數(shù)的運(yùn)用
第四點(diǎn)認(rèn)識(shí):誰雇用我,我就叫誰老板。當(dāng)然這是一種比喻的說法,但卻很形象的指出了函數(shù)體中this的真正含義。與一般的面向?qū)ο笳Z言不同,F(xiàn)AS中的this只指代調(diào)用該函數(shù)時(shí)的實(shí)體。這么說可能比較難懂,那就來看一下下面這個(gè)例子:
a = 1;
function myMethod() {
trace(this.a);
}
function myObject(){
this.a = 0;
this.method = myMethod;
}
myobj = new myObject;
myobj.method(); // 3.4式 輸出 0
myFunc = myobj.method;
myFunc(); // 3.5式 輸出 1
這里,3.4式將如一般情況一樣輸出myobj對象的成員變量a的值0,而3.5式中的myFunc雖然等價(jià)于myobj的方法method(即myMethod),但由于這時(shí)的調(diào)用實(shí)體已變成更外層的對象或影片片段,this.a所指的變量也應(yīng)為此對象或影片片段的成員(即首句中定義的a),因而輸出為1。在C++中,this只能指代本對象的實(shí)例,也只能在成員函數(shù)中使用,而且要把一個(gè)成員函數(shù)賦值給某個(gè)函數(shù)指針也是不被允許的。這也充分體現(xiàn)了FAS中其實(shí)根本沒有成員函數(shù)這一概念,所謂“方法”只不過是結(jié)構(gòu)體中函數(shù)指針的偽裝罷了。再補(bǔ)充一下,this在沒有函數(shù)調(diào)用時(shí)永遠(yuǎn)只指代外層對象或影片片段,所以別指望下面那段程序能為對象myobj添加成員或?yàn)槌蓡T賦值:
with (myobj) {
this.a = 0; // a為要添加的成員
this.b = 1; // b為myobj的成員
}
第五點(diǎn)認(rèn)識(shí):關(guān)于new一個(gè)對象的實(shí)際流程。大家都清楚,創(chuàng)建一個(gè)對象的格式是(沒有參數(shù)時(shí)括號(hào)可省):
myobj = new myObject(...);
可你有沒有想過它的實(shí)際操作過程呢?別看它長的那么象Java或者C++里的創(chuàng)建對象實(shí)例,它可沒那么高級,記住了,F(xiàn)AS里的對象實(shí)質(zhì)可是結(jié)構(gòu)體呀!或許你還不知道,在你定義了一個(gè)函數(shù)的時(shí)候,系統(tǒng)就已經(jīng)為你自動(dòng)創(chuàng)建了一個(gè)同名對象。而它可沒有你函數(shù)中用this添加的成員,它的唯一成員只有object類型的prototype?,F(xiàn)在你有點(diǎn)明白了為什么要有如3.1式那樣:
anyFunction.prototype.anyMember = ...
的寫法了吧。以3.2式為例,實(shí)際執(zhí)行創(chuàng)建對象的過程是這樣的:
(1)定義myobj為對象(只是一般的對象,無任何成員)
(2)執(zhí)行new后指定的函數(shù)(管它是不是構(gòu)造函數(shù),但若有this則指該對象)
(3)拷貝myObject.prototype的所有成員到myobj門下
現(xiàn)在你知道FAS中的new與標(biāo)準(zhǔn)面向?qū)ο笳Z言中的new的區(qū)別了吧,是不是也不用再對prototype產(chǎn)生困惑了呢。
3、函數(shù)使用的技巧