學(xué)習(xí)ActionScipt的一些提示
ActionScript 3.0是一種強(qiáng)大的面向?qū)ο笳Z(yǔ)言,它為Flash Player描繪了一種新的編程模型。如果你已經(jīng)對(duì)ActionScript 1.0或2.0很熟悉,那么當(dāng)你使用ActionScript 3.0開(kāi)發(fā)你的第一個(gè)應(yīng)用程序的時(shí)候需要知道一些語(yǔ)言差別。
注:更多資料,請(qǐng)參考Flex 2.0 Language Reference中ActionScript 2.0 和ActionScript 3.0之間的不同點(diǎn)的列表。
為了幫助大家更容易地過(guò)渡到ActionScript 3.0,我編輯了下面的列表,其中包括技巧和你可能在開(kāi)發(fā)中會(huì)遇到的普遍的問(wèn)題。
•為所有變量,參數(shù)和返回值聲明類(lèi)型。為所有變量,參數(shù)和返回值聲明類(lèi)型不是必須的,但是它被認(rèn)為是最好的習(xí)慣。它將會(huì)幫助編譯器給你更多地有用的錯(cuò)誤信息。它還會(huì)增強(qiáng)運(yùn)行時(shí)的性能,因?yàn)樘摂M機(jī)將會(huì)認(rèn)為你事先知道你所做的工作。實(shí)際上,它是如此重要所以如果你沒(méi)有聲明我們會(huì)給出一個(gè)警告。
•注意現(xiàn)在沒(méi)有訪(fǎng)問(wèn)方式的聲明都默認(rèn)是internal方式,而不是public。現(xiàn)在默認(rèn)的訪(fǎng)問(wèn)方式是internal而不是public,這就是說(shuō)這個(gè)聲明只對(duì)含有這個(gè)聲明的包可見(jiàn),而不是對(duì)所有代碼都可見(jiàn)。這一點(diǎn)和其它一些語(yǔ)言相一致,比如JAVA。因?yàn)锳ctionScript2.0的聲明默認(rèn)為是public,這個(gè)變化將很可能造成普遍的錯(cuò)誤,所以請(qǐng)總是在聲明前面加上訪(fǎng)問(wèn)方式,讓你的意圖更加清楚。為了鼓勵(lì)這個(gè)好習(xí)慣,ActionScript 3.0編譯器將在沒(méi)有訪(fǎng)問(wèn)方式聲明的時(shí)候給出一個(gè)警告。
•注意類(lèi)都是默認(rèn)為封裝(sealed)的,也就是說(shuō)不能在運(yùn)行時(shí)動(dòng)態(tài)地添加屬性。現(xiàn)在類(lèi)可以是動(dòng)態(tài)的(dynamic)或者封裝的(sealed)。動(dòng)態(tài)(dynamic)類(lèi)可以在運(yùn)行時(shí)添加動(dòng)態(tài)屬性;封裝(sealed)類(lèi)不行。因?yàn)椴恍枰獌?nèi)部哈希表來(lái)保存動(dòng)態(tài)的屬性,封裝(sealed)類(lèi)占用內(nèi)存少,而且編譯器可以對(duì)它提供更好的錯(cuò)誤反饋。Class Foo這種聲明就是封裝(sealed)的。要聲明一個(gè)動(dòng)態(tài)(dynamic)類(lèi),就使用dynamic關(guān)鍵字——比如,dynamic class Foo。
•使用包(package)聲明把一個(gè)類(lèi)放到一個(gè)包(package)里面。Package是ActionScript 3.0中一個(gè)新的關(guān)鍵字。
ActionScript 2.0 代碼:
class mx.controls.Button { … }
ActionScript 3.0 代碼:
package mx.controls { class Button { .. } }
在ActionScript 2.0中,一個(gè)public類(lèi)必須放在一個(gè)文件名和類(lèi)名相同的文件中。多個(gè)類(lèi)可能在同一個(gè)文件中聲明,但是只有一個(gè)類(lèi)可能是public,并且這個(gè)類(lèi)的名字必須和文件名字相同。
•導(dǎo)入類(lèi),即使對(duì)這個(gè)類(lèi)的引用都是完全合法的。要使用MyPackage.MyClass類(lèi),你必須導(dǎo)入它:
import MyPackage.MyClass;
你必須這樣做既是所有的引用都是完全合法的,并且要使用完整的名字MyPackage.MyClass。在ActionScript 3.0中,import語(yǔ)句表明你想要使用一個(gè)來(lái)自另外一個(gè)包中的類(lèi),而在ActionScript 2.0中,它只是用來(lái)幫助記憶類(lèi)名。在ActionScript 3.0中,完整的類(lèi)名只是用來(lái)消除歧義,而不再是import語(yǔ)句的替代品。
也可以使用 * 通配符來(lái)導(dǎo)入一個(gè)包中的所有類(lèi)。
import MyPackage.*;
單個(gè)地導(dǎo)入類(lèi)被認(rèn)為是一個(gè)好習(xí)慣,因?yàn)檫@樣更明確地表明了你的代碼使用了哪一個(gè)類(lèi)。
•始終標(biāo)記方法的覆寫(xiě)。Override關(guān)鍵字可以幫助避免覆寫(xiě)方法時(shí)常見(jiàn)的錯(cuò)誤,比如對(duì)一個(gè)被覆寫(xiě)得方法定義了錯(cuò)誤的名字或者被覆寫(xiě)的方法的名字改變導(dǎo)致的錯(cuò)誤。這樣做會(huì)使包含有覆寫(xiě)方法的代碼看起來(lái)更清晰。因?yàn)榫幾g器能夠知道一個(gè)方法是否試圖覆寫(xiě)另外一個(gè),它就能執(zhí)行更好的檢查。ActionScript 3.0中的override關(guān)鍵字是從C#的override關(guān)鍵字中獲得的靈感。
•在函數(shù)中定義返回類(lèi)型。為一個(gè)函數(shù)定義返回類(lèi)型是一個(gè)好習(xí)慣。如果你忽略了返回類(lèi)型,會(huì)出現(xiàn)一個(gè)警告。這是為了類(lèi)型的安全性,這樣一來(lái)你就不會(huì)無(wú)意中沒(méi)有寫(xiě)返回類(lèi)型而得到默認(rèn)的Object返回類(lèi)型。如果一個(gè)函數(shù)沒(méi)有返回任何值,將它的返回類(lèi)型聲明為void。
•注意,delegate現(xiàn)在被定義到了語(yǔ)言里,使得事件分派更簡(jiǎn)單。在ActionScript 2.0中,把事件指向到一個(gè)方法需要使用mx.utils.Delegate 類(lèi)或者其他的工作:
import mx.utils.Delegate;
myButton.addEventListener(”click”, Delegate.create(this, onClick));
在ActionScript 3.0中,方法的一個(gè)引用會(huì)自動(dòng)記住它引用的對(duì)象實(shí)例。這被稱(chēng)為method closure。本質(zhì)上來(lái)說(shuō),這就是一個(gè)自動(dòng)的delegate。所以,代碼可以簡(jiǎn)單地寫(xiě)成:
myButton.addEventListener(”click”, onClick);
•現(xiàn)在解除一個(gè)null或者undefined的引用將會(huì)拋出一個(gè)異常。解除一個(gè)null或者undefine的引用在以前的ActionScript中會(huì)被忽略并且定義引用為undefined。現(xiàn)在,一個(gè)TypeError異常會(huì)拋出。提防無(wú)意中解除的null或undefined引用,并且依靠這個(gè)報(bào)告錯(cuò)誤的特性。這種新的拋出異常的特性與ECMAScript定義相符合。
•使用-verbose-stacktraces和 -debug選項(xiàng)。使用命令行選項(xiàng)-verbose-stacktraces和-debug編譯可以使文件名和行號(hào)出現(xiàn)在Flash Player的警告框中。當(dāng)一個(gè)運(yùn)行時(shí)錯(cuò)誤發(fā)生時(shí),一個(gè)對(duì)話(huà)框會(huì)描述這個(gè)錯(cuò)誤并且列出它發(fā)生錯(cuò)誤的地方的調(diào)用堆棧。使用-verbose-stacktraces和-debug選項(xiàng)可以讓在源代碼中定位錯(cuò)誤變得簡(jiǎn)單。
•顯式聲明bindable屬性。屬性不再默認(rèn)為bindable。你必須使用[Bindable]元數(shù)據(jù)標(biāo)簽來(lái)聲明它們?yōu)閎indable。
•注意Flash Player API被重新組織到了包里。以前Flash Player API中所有的類(lèi)和函數(shù)都是全局的。現(xiàn)在有了許多包,象flash.display, flash.events, flash.ui以及其它。舉個(gè)例子,MovieClip現(xiàn)在是flash.display.MovieClip并且getTimer 和 setInterval都被放進(jìn)了flash.utils 包中。
•使用新的Timer類(lèi),而不是setInterval/setTimeout。與setInterval/setTimeout函數(shù)相比,新的Timer類(lèi)為timer事件提供了更清晰的機(jī)制。新的Timer類(lèi)與setInterval方法相比有很多優(yōu)勢(shì),比如不需要處理ID數(shù)字間隔,還有一個(gè)更好的,面向?qū)ο蟮慕涌凇N覀儼咽褂肨imer而不是使用setInterval和setTimeout看作是一個(gè)好習(xí)慣。
•確認(rèn)事件(event)是繼承而來(lái)的。現(xiàn)在事件(event)是強(qiáng)類(lèi)型的,并且必須是新的Event基類(lèi)的子類(lèi)。新的Event類(lèi)讓事件體系更加清晰和有效。但是,這也意味著當(dāng)分派事件的時(shí)候你不能再使用Object類(lèi)的通用實(shí)例了,并且你不能使用對(duì)象的文字簡(jiǎn)寫(xiě)——例如,{type: ‘customEvent’ }。
你現(xiàn)在需要使用Event類(lèi)(例如,dispatchEvent(new Event (’myCustomEventType’))),而不是創(chuàng)建一個(gè)通用的Object類(lèi)。如果你想要傳遞附加的屬性就需要從Event繼承。不使用Object的動(dòng)機(jī)是為了獲得更高的類(lèi)型安全性和效率。
•注意可視的元素必須繼承自DisplayObject,并且你可以像其它類(lèi)一樣定義它們。組件現(xiàn)在通過(guò)new動(dòng)態(tài)創(chuàng)建并且使用addChild被添加到顯示列表中。所以,不鼓勵(lì)使用createChild。可視化的實(shí)體,包括TextField,可以像其它對(duì)象一樣實(shí)例化并且使用addChild或addChildAt簡(jiǎn)單地添加到顯示列表中。注意,這意味著一些API消失了,比如createEmptyMovieClip 和 createTextField。你可以使用new TextField而不是使用createTextField來(lái)創(chuàng)建一個(gè)新的TextField。
•現(xiàn)在在Flash中推薦使用 E4X (ECMAScript for XML)來(lái)操作XML。E4X與以前的Flash XML類(lèi)相比非常強(qiáng)大并且更好地整合進(jìn)了語(yǔ)言中,它還提供了很多新的性能。以前的Flash XML類(lèi)依然可以使用。如果你喜歡用以前的XML API,它就在flash.xml包中。它依然可用只是重新命名成了XMLDocument。
•當(dāng)使用E4X的時(shí)候使用toXMLString方法。toString方法沒(méi)有為對(duì)象返回完整的XML標(biāo)記;如果你想獲得,使用toXMLString方法。toString方法為XML對(duì)象返回一個(gè)簡(jiǎn)單的字符串。它并不會(huì)完全將XML對(duì)象序列化。要獲得XML標(biāo)記,請(qǐng)調(diào)用toXMLString方法。
•For……in循環(huán)將不再枚舉類(lèi)中聲明的屬性或者方法。它只枚舉一個(gè)對(duì)象的動(dòng)態(tài)屬性。ActionScript 3.0特性中有一個(gè)針對(duì)對(duì)象自省的新的先進(jìn)機(jī)制,叫做describeType。在ActionScript 3.0中使用它來(lái)自省對(duì)象。
•現(xiàn)在一個(gè)SWF文件的根對(duì)象可以是你自主選擇的一個(gè)自定義類(lèi)的實(shí)例。ActionScript 2.0中,一個(gè)SWF文件的根對(duì)象總是MovieClip的實(shí)例。而在ActionScript 3.0中,它可以使Sprite的任意子類(lèi)。你可以設(shè)定一個(gè)類(lèi)作為一個(gè)SWF文件的DocumentRoot。當(dāng)其加載時(shí),SWF文件會(huì)將它實(shí)例化然后將其作為自己的根對(duì)象。
特別感謝我們的開(kāi)發(fā)團(tuán)體為這篇文章提出建議。這里列出的決不是詳盡的,但是它是一個(gè)起點(diǎn),可以幫助你打好學(xué)習(xí)ActionScript 3.0的基礎(chǔ)。如果你熟悉其它的面向?qū)ο蟮恼Z(yǔ)言,你可能發(fā)現(xiàn)這些提示只是一個(gè)復(fù)習(xí)——復(fù)習(xí)你已經(jīng)在別處學(xué)習(xí)到的并且可以立即在ActionScript 3.0中使用的技巧。
如果你對(duì)ActionScript 3.0和面向?qū)ο缶幊淌且粋€(gè)新手,那么這些提示將會(huì)派得上用場(chǎng)。對(duì)你來(lái)說(shuō),這就是一個(gè)簡(jiǎn)單的可以幫你鞏固知識(shí)的列表。編碼愉快!
新聞熱點(diǎn)
疑難解答
圖片精選