本文譯者:egoldy 文章出處: http://www.ultrashock.com 文章性質(zhì):翻譯
ActionScript 2.0-簡(jiǎn)介
隨著FLASHMX2004的推出,Macromedia公司推出了一種新的腳本類型稱為as2,在要教程中我們將要了解AS2的新特性。新的面向?qū)ο蟮哪P鸵约叭绾问笰S1的腳本過度到AS2。
為什么我們需要一種新的腳本語言。
如果你只是做一些簡(jiǎn)單的動(dòng)畫是不需要用一種新的腳本語言的,其實(shí)有許多項(xiàng)目是不需要腳本語言的。如果你真的不需要使用腳本語言那這個(gè)教程將是一個(gè)很短的教程,現(xiàn)在你就可以結(jié)束了。:)
如果你是一名開發(fā)人員,在開發(fā)一些比較復(fù)雜的項(xiàng)目,那么AS1就顯得有些力不從心,或者不能勝任。對(duì)于使用主流語言如java,c++,c#開發(fā)程序的程序員來說AS1是很怪的。他們是要走一些彎路來學(xué)習(xí)AS1特別是在面向?qū)ο缶幊虝r(shí)。
在as2中這些程序員將發(fā)現(xiàn)許多熟知的語法,AS2象JAVA。JSCRIPT.NET和javascript 2.0的程序員將感覺更好,因?yàn)锳S2的語言基礎(chǔ)來自于ECMASCRIPT EDITION 4.AS2可以使程序員寫出更健狀的程序,也可以吸引更多的程序員來學(xué)習(xí)FLASH。
好,你可能并不開發(fā)程序,那你喜歡開發(fā)游戲嗎。或者是開發(fā)交互式的展示。好消息是AS2為我們開發(fā)這些提供了很有力的支持。
如果你對(duì)學(xué)習(xí)AS2沒有興趣,也不用擔(dān)心。因?yàn)閙acromedia保留了AS1語法。你只是不能掌握這種語言的新特性而已。實(shí)際上在最后的編譯過程中AS2和AS1都將被編譯為相同的bytescode。這么做的原因大多是為了兼容FLASH6。ok.下面我們將繼續(xù)學(xué)習(xí)。
ActionScript 2.0-AS1.0中的一點(diǎn)點(diǎn)面向?qū)ο缶幊?/B>
在我們轉(zhuǎn)移到AS2之前先讓我了解一下在AS1時(shí)的面向?qū)ο蟮木幊。這一節(jié)對(duì)于在FLASH5和FLASHMX不太了解面向?qū)幊痰娜藖碚f很重要。如果你已經(jīng)很了解這些可以直接跳過此節(jié)。
盡管AS1不是真正的面向?qū)ο蟮木幊陶Z言,開發(fā)人員已經(jīng)在有些時(shí)候使用它進(jìn)行面向?qū)ο蟮木幊塘恕S1中的任何東西都是依靠原型鏈也就是對(duì)象之間的聯(lián)系。所以在AS1中使用面向?qū)ο笮枰私庠玩湥ɑ蛘呤窃偷年P(guān)鍵字)。
AS1的類就象是規(guī)則的函數(shù)。方法附加在這個(gè)的類的原型上。例如:
// Wizard class function Wizard() { } // help()方法附加在WIZARD函數(shù)的原型上。 Wizard.prototype.help = function() { };
如果我們把help()直接放在wizard class類中。FLASH在查找屬性和方法時(shí)就不會(huì)找到它,因?yàn)镕LASH在查找是沿著原型鏈進(jìn)行搜索的。而在為所有的Wizard類創(chuàng)建一個(gè)實(shí)例copy.下面就是為每個(gè)實(shí)例創(chuàng)建的copy. function Wizard(){ this.help=function(){}}對(duì)于java,c#的程序員來說。這樣的將方法代碼放在類中會(huì)看來很熟悉,然而為了代碼的可重用性我們還是應(yīng)將方法附加在類的原型鏈上。 在下面的例子中假如我們針對(duì)一個(gè)類上有兩個(gè)方法,一個(gè)是附加在原型鏈上,另一個(gè)是直接放在類中,flash將先獲得內(nèi)部方法。
// AS1_OOP_01.fla function TestClass() { this.method = function() { trace("Internal method"); }; this.prop = ">>> Internal prop"; }// Attach a method to the prototype object of the class TestClass.prototype.method = function() { trace("Prototype method"); };TestClass.prototype.prop = ">>> Prototype prop";// Create an instance of the TestClass class var w = new TestClass();// Internal method is located before the prototype method w.method();// Replace the Internal method w.method = function() { trace("New method"); }; w.method();// Delete the Internal method delete w.method;// The only method remaining is the prototype method w.method();// Test the properties trace(w.prop);w.prop = ">>> New prop"; trace(w.prop);delete w.prop; trace(w.prop); 上面的例子的輸出內(nèi)容為:
從上面這個(gè)例子我們可以看出在使用AS1面向?qū)ο驅(qū)τ诔鯇W(xué)者來說是極易混淆的。其中知道將代碼寫在什么位是很重要的,因?yàn)樗赡芙?jīng)常出現(xiàn)意想不到的結(jié)果,正如在商業(yè)上有一句流行的話是:但是等等,還有更多。。。。
ActionScript 2.0-AS2.0中的新特性
AS2中的新特性
AS2實(shí)際上不是一種新的語言,它是在AS1基礎(chǔ)上的升級(jí),如果你基本上掌握了AS1編程,那么學(xué)習(xí)它應(yīng)是很容易的。接下來讓我們看一下AS2所提供的新東西。
.嚴(yán)格的數(shù)據(jù)類型和編譯提示。
.以數(shù)據(jù)類型為基礎(chǔ)的代碼提示。
.針對(duì)OOP的新的關(guān)鍵字和特性。
class、Interface、extends、implements、public、private、static、dynamic、intrinsic、import、class path、get、set
下面就讓我看一下以上這些每一項(xiàng)都有什么新特點(diǎn)。
嚴(yán)格的數(shù)據(jù)類型
在比較專業(yè)編程語言中,表達(dá)是依靠數(shù)據(jù)類型的。它給我們的具大的好處是:它可以幫助編譯器發(fā)現(xiàn)潛在的問題,獲取類型不配的錯(cuò)誤信息。它可以使你的代碼清晰易讀。
在AS1中聲明一個(gè)變量如count的過程如下:
var count;
在AS2中聲明的過程應(yīng)是這樣。
var count:Number;
注意,它的語法結(jié)構(gòu)是:<變量>:<數(shù)據(jù)類型>,這對(duì)許多java,c#,c++的程序員來說可能認(rèn)為有些怪,這實(shí)際上是ECMA-262協(xié)會(huì)制定的規(guī)定,macromedia公司是按照這個(gè)規(guī)定做的而已。
AS2的變量,函數(shù)以及返回值都支持嚴(yán)格的數(shù)據(jù)類型,如下例函數(shù)接收字符串參數(shù)返回一個(gè)布爾值。
function func(arg:String):Boolean{};
當(dāng)一個(gè)函數(shù)在沒有接收到參數(shù)和返回任何值時(shí),使有Void做為數(shù)據(jù)類型。
function func(arg:Void):Void{};
這種參數(shù)被寫空的形式看起來有些怪,但這種用法卻被大量的應(yīng)用在組件的編寫上,它只意味著當(dāng)前沒有指定的參數(shù)。然而如果你試著將參數(shù)傳給這個(gè)函數(shù),編譯器在編譯時(shí)是不會(huì)出現(xiàn)任何的錯(cuò)誤提示同時(shí)也會(huì)將參數(shù)進(jìn)行傳遞的。
盡管AS2支持嚴(yán)格的數(shù)據(jù)類型,卻并沒有被真正的執(zhí)行這種語法,可是當(dāng)編譯器發(fā)現(xiàn)有數(shù)據(jù)類型不配的情況時(shí)就會(huì)出現(xiàn)錯(cuò)誤提示信息,使用嚴(yán)格的數(shù)據(jù)來進(jìn)行編程是一個(gè)好的開始習(xí)慣。它的好處我們?cè)谏厦嬉呀?jīng)說過。如果你使用嚴(yán)格的數(shù)據(jù)類型來編程,那么你在發(fā)布時(shí)應(yīng)指定使用AS2,并且指定發(fā)布為FLASH PLAYER 7。
使用嚴(yán)格的數(shù)據(jù)類型,新的編譯器為你提供的了許多新的編譯提示阻止你的影片出現(xiàn)類型不配的錯(cuò)誤,但在編譯過程中可能要花去較長(zhǎng)的時(shí)間調(diào)試。
代碼提示
在FALSHMX中的代碼提示是依據(jù)變量名稱的擴(kuò)展如myPushButton_pb,mycomboBox_cb中的_pb,_cb來出現(xiàn)代碼提示的,在2004中你會(huì)發(fā)現(xiàn)大多數(shù)的變量擴(kuò)展不在生效,新版本的AS2以不同的約定型式來出現(xiàn)代碼提示。
當(dāng)一個(gè)變量類型被指定(如果這個(gè)變量類型對(duì)這個(gè)類是有效的)方法和屬性的代碼提示會(huì)在點(diǎn)的后面出現(xiàn),否則是不會(huì)出現(xiàn)任何代碼提示的。通過指定的數(shù)據(jù)類型來顯示comboBox的代碼提示如:
var combo:mx.controls.comboBox; combo.
你可以通過打開如下文件查看默認(rèn)的擴(kuò)展代碼提示如:
<Flash installation folder>\<language>\First Run\ActionsPanel\AsCodeHints.xml
小提示:在2004中加入FLASHMX的代碼提示
如果你使用2004來編輯你的FLASHMX文檔,你可以將部分的FLASHMX代碼提示加入到2004的代碼提示中。
復(fù)制<Flash MX installation folder>\<language>\First Run\ActionsPanel\CustomActions\UIComponents.xml,中的
<codehints> <typeinfo pattern="*_ch" object="FCheckBox"/> <typeinfo pattern="*_pb" object="FPushButton"/> <typeinfo pattern="*_rb" object="FRadioButton"/> <typeinfo pattern="*_lb" object="FListBox"/> <typeinfo pattern="*_sb" object="FScrollBar"/> <typeinfo pattern="*_cb" object="FComboBox"/> <typeinfo pattern="*_sp" object="FScrollPane"/> <typeinfo pattern="globalStyleFormat" object="FStyleFormat"/> </codehints>
這一段到Flash MX 2004's UIComponents.xml文件的結(jié)束標(biāo)記之前,同樣將這一段復(fù)制到2004的AsCodeHints.xml文件的<codehints></codehints> 之間注意多余的<codehints>標(biāo)記要?jiǎng)h除。
現(xiàn)在你就可以在2004中使用FLASHMX的組件代碼提示了。
ActionScript 2.0-針對(duì)OOP的關(guān)鍵字和特性
下面我們將真正研究一下AS2的特性,在早期往往是在討論AS1復(fù)雜的面向?qū)ο缶幊瘫葘?shí)際工作更多一些,現(xiàn)在你將很快的看到,你不用花很多時(shí)間去爭(zhēng)論怎么樣做到最好的繼承,將代碼放置在哪和如何組織好你的代碼庫。
讓我們先回顧一下OOP基礎(chǔ),OOP的最基本單元是對(duì)象,它包含兩部分:代碼和數(shù)據(jù)。由于對(duì)象是一種以自己自足的形式出現(xiàn),因此它的數(shù)據(jù)和代碼(方法)不需要公開。就象一個(gè)黑盒子,對(duì)象負(fù)責(zé)以自身的方法去管理自身的數(shù)據(jù),對(duì)象與對(duì)象之間通過傳遞信息通訊。這些信息以公用或公開的方式傳遞和接收。而內(nèi)部的數(shù)據(jù)和方法并沒有直接參與其中,這就是OOP的基本原理。
在OOP的設(shè)計(jì)中,比做是一張大圖,要想到重點(diǎn)和要實(shí)現(xiàn)的目標(biāo),以及各個(gè)部分之間的聯(lián)系。將這張大圖分成小的單元,并且保證各自的自身獨(dú)立性,那么整個(gè)項(xiàng)目就很容易完成。而這些小的單元在OOP中就被稱為類。所有這些AS2都提供了很好的支持。
下面這些關(guān)鍵字與OOP有關(guān):
class interface extends implements public private static dynamic import get set intrinsic
我們不在重復(fù)mcromedia的幫助文檔中對(duì)每一關(guān)鍵字的描述,我們可以用實(shí)例來說明。注意關(guān)鍵字intrinsic是mcromedia內(nèi)部使用的關(guān)鍵字。這里面沒package也就包的關(guān)鍵字,但是它與類路徑的工作方式是很重要的,就象是其它語言中的包一樣,如JAVA。
下面我們來看一下例子,在AS1中的類,將其改寫為AS2的類。
// 構(gòu)造函數(shù) _global.Parent = function(name) { this.init.apply(this, arguments); }; // 類的屬性 Parent.lastNames = new Array(); Parent.prototype.init = function(name) { this.lName = name; Parent.lastNames.push(name); this.id = Parent.lastNames.length-1; trace("Added '"+ Parent.lastNames[this.id] +"' at: "+ this.id); }; Parent.prototype.getLastName = function() { return (this.lName); }; Parent.prototype.setLastName = function(s) { this.lName = s; Parent.lastNames[this.id] = s; }; Parent.prototype.getNames = function() { return (Parent.lastNames); }; Parent.prototype.addProperty("lastName", Parent.prototype.getLastName, Parent.prototype.setLastName); Parent.prototype.addProperty("names", Parent.prototype.getNames, null); 上面的代碼改寫為AS2就向下面這樣:
新的關(guān)鍵字被應(yīng)用在如下的例子中:class, private, public, static, get, set
class Parent { private var lName:String = ""; private var id:Number; private static var lastNames:Array = new Array(); // 構(gòu)造函數(shù) public function Parent(name:String) { init.apply(this, arguments); } private function init(name:String):Void { lName = name; lastNames.push(name); id = lastNames.length-1; trace("Added '"+ lastNames[id] +"' at: " + id); } public function get lastName():String { return lName; } public function set lastName(s:String):Void { lName = s; lastNames[id] = s; } public function get names():Array { return lastNames; } }
通過上面的AS1和AS2執(zhí)行同一個(gè)類。我們可以看出二者非常的相似,主要的不同以AS2為例:
1。以外部文件的形式存在如.as,同時(shí)注意類的名稱要與外部文件名稱相同。 2。AS2區(qū)分大小寫,在AS2中object 和 Object是不同的。 3。類的方法定義在類的內(nèi)部。 4。類的內(nèi)部不在允許有內(nèi)部類出現(xiàn)。 5。關(guān)鍵字如public,private,static等寫在類方法或?qū)傩缘那懊妗?BR>6。數(shù)據(jù)類型寫在方法或?qū)傩悦Q的后面如:name:string; 7.創(chuàng)建get|set方法更容易使用如下方法:[modifier] function get|set functionName(argument[:type,...])[:type] {}
ActionScript 2.0--THIS的范圍
關(guān)鍵詞THIS是可以任意使用的一個(gè)關(guān)鍵字,您可能也清楚它的使用,但是當(dāng)一個(gè)局部變量和一個(gè)類的屬性共用一個(gè)名稱時(shí)。如果你要指定類的屬性則必須要用this.下面的例子就說明這個(gè)問題。
1。新建一個(gè)FLASH文檔,選擇ActionScript文件,如下:
2。將你的文件另存在你在的工作目錄中名為scopetest.as.就象我們之前提到過的一樣,要將你的類名稱和你的文件名保持一致。
3。輸入如下代碼:
class ScopeTest { private var myVar:String = "I am the class property!"; public function doTest(Void):Void { var myVar:String = "I am the local variable!"; trace ("myVar = " + myVar); trace ("this.myVar = " + this.myVar); } }
4。保存你的文件 5。創(chuàng)建一個(gè)新FLASH文檔,將其另存為ScopeTest.fla文件,且確保和你的類文件在同一目錄下。 6。在第一幀上輸入如下代碼:
var myTest:ScopeTest = new ScopeTest(); myTest.doTest();
7。測(cè)試你影片
ActionScript 2.0--私有或保護(hù)
在AS2中需要注意的一件事是私有屬性。就象JAVA一樣,私有成員意味著只有類自身可以訪問。而子類卻不可以訪問,包括是在同一個(gè)類路徑或包內(nèi)。就象其它語言一樣私有屬性多半是為了起到保護(hù)作用。
由于這種特性只在編譯時(shí)才會(huì)生效,一件非常重要的事情是你必須確保編譯器能正確的獲得私有的方法和屬性。因此注意對(duì)你的實(shí)例名使用嚴(yán)格的類型指定,如下我們聲明一個(gè)屬性為私有屬性:
class PrivateMemberClass{ private Var privateProp:String="I am a private property"; }
這個(gè)私有屬性名為privatProp.當(dāng)你的實(shí)例名沒有用嚴(yán)格的數(shù)據(jù)類型指定時(shí)是可能被實(shí)例訪問。
var instance=new PrivateMemberClass(); trace(instance.privateProp);
此時(shí)將會(huì)輸出“I am a private property".
但是如果你使用的嚴(yán)格的數(shù)據(jù)類型指定就會(huì)出現(xiàn)編譯錯(cuò)誤。
如: var instance:PrivateMemberClass=new PrivateMemberClass(); trace(instance.privateProp);
此時(shí)就會(huì)出現(xiàn)編譯錯(cuò)誤。這是許多人常有錯(cuò)誤,總會(huì)問為什么私有屬性可以被實(shí)例訪問,現(xiàn)在你知道了。
出處:WebStudio
責(zé)任編輯:藍(lán)色
上一頁 下一頁 Flash ActionScript 2.0 基礎(chǔ)教程 [2]
◎進(jìn)入論壇Flash專欄版塊參加討論
|