利用函數(shù)返回函數(shù):
有一個(gè)proxyObject對(duì)象,我們希望根據(jù)proxy對(duì)象的內(nèi)容來(lái)確定一個(gè)方法,來(lái)處理myObject對(duì)象。
當(dāng)proxyObject是字符串時(shí),我們又希望根據(jù)它字符串的內(nèi)容來(lái)確定返回不同的函數(shù)(或方法)。這些函數(shù)參數(shù)和類(lèi)型是不完全相同的,有的可能是一個(gè)參數(shù),有的可能是多個(gè)參數(shù),不同類(lèi)型。
那么傳統(tǒng)的解決方法:在函數(shù)內(nèi)部調(diào)用其他函數(shù)就顯得力不從心。即使解決,也不如我下面chooseFuncBy()這個(gè)函數(shù)簡(jiǎn)潔。
缺點(diǎn)當(dāng)然有,那就是比較靈活,你一定要清楚管理好每個(gè)目標(biāo)函數(shù)和判斷邏輯。因?yàn)檫@種靈活的編程方式編譯器是無(wú)法檢查,不能查出類(lèi)型不匹配這種錯(cuò)誤的。菜鳥(niǎo)慎用。
//通過(guò)A調(diào)用只有一個(gè)參數(shù)的aFunc(): chooseFuncBy("A")("A func has only one parameter."); //輸出:aFunc():A func has only one parameter.
//通過(guò)B調(diào)用有兩個(gè)參數(shù)的bFunc(): chooseFuncBy("B")("B func has two parameters.","No.2 parameter"); //輸出:bFunc():B func has two parameters. one more Parameter:No.2 parameter
//字符串不符,默認(rèn)函數(shù) chooseFuncBy("wu lala")("I choose A function"); //輸出:Welcome to Kingda.org! My blog
var withObj:Object = new Object(); var myObj:Object = {name:"黑羽", blog:"http;//www.kingda.org", hobby:"Starcraft"}; chooseFuncBy(withObj)(myObj); /* 輸出: objectFunc(): name:黑羽 blog:http;//www.kingda.org hobby:Starcraft */
function chooseFuncBy(inputString):Function { //運(yùn)用一:利用參數(shù)的種類(lèi)來(lái)確定返回的函數(shù) if (!(typeof(inputString) == "string")) { return objectFunc; } //運(yùn)用二:根據(jù)參數(shù)內(nèi)容來(lái)返回函數(shù) switch (inputString) { case "A": return aFunc; case "B": return bFunc; default: return kingdaFunc; } //更多延伸運(yùn)用:利用參數(shù)個(gè)數(shù)、instanceof確定不同Class的實(shí)例來(lái)選擇函數(shù)等等 }
function aFunc(nS:String):Void { trace ("aFunc():" + nS); }
function bFunc(nS:String, nP:String):Void { trace ("bFunc():" + nS + " one more Parameter:"+ nP); }
function kingdaFunc():Void { trace ("Welcome to Kingda.org! My blog"); }
function objectFunc(kingdaObj:Object):Void { trace ("objectFunc():"); for (var i in kingdaObj) { trace ( i + ":" + kingdaObj[i]); } }
如上次所說(shuō),函數(shù)也是一個(gè)Object,不僅如此,函數(shù)Object也可以動(dòng)態(tài)添加屬性和方法。
函數(shù)動(dòng)態(tài)添加屬性
運(yùn)用一:利用函數(shù)動(dòng)態(tài)屬性來(lái)計(jì)算函數(shù)調(diào)用次數(shù)
當(dāng)然你完全可以用這個(gè)技巧來(lái)干更多更有用的事,我只是拋磚引玉開(kāi)個(gè)頭。 :)
一個(gè)游戲中有開(kāi)火函數(shù)shot()。我想知道總共開(kāi)火了多少次,那么可以使用shot函數(shù)的屬性times。
總的來(lái)說(shuō),對(duì)于AS2.0來(lái)說(shuō),這是一個(gè)不太好的編程習(xí)慣,雖然很方便。但由于動(dòng)態(tài)屬性的使用使得編譯器無(wú)法進(jìn)行類(lèi)型檢查,也使的大項(xiàng)目的犯錯(cuò)可能性增加。 對(duì)于AS1.0來(lái)說(shuō),與其使用Global變量,如_root, _level1,那么我寧愿建議你使用這個(gè)編程技巧。總比Global變量來(lái)的安全,不易產(chǎn)生沖突和蛛網(wǎng)效應(yīng)。
注意,引用shot函數(shù)動(dòng)態(tài)屬性時(shí),在函數(shù)內(nèi)不能使用this.times,那不會(huì)指向函數(shù)本身的屬性。只能使用函數(shù)名加屬性,例: shot.times
shot.times = 0; //初始化times shot();//輸出:Shot(): times:1 shot();//輸出:Shot(): times:2 shot();//輸出:Shot(): times:3
function shot():Void { shot.times ++; trace ("Shot(): times:"+ shot.times); //shot的其他代碼放在這兒 }
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁(yè) 深入了解Function [1] 下一頁(yè) 深入了解Function [3]
◎進(jìn)入論壇Flash專(zhuān)欄版塊參加討論
|