物件由類別所建立。類別可視為建立物件的藍圖或範本,描述物件的資料型態 (data types) 及物件的特性:屬性 (變數) 與方法 (函數) ;類別也可視為一組應用程式。如果把類別想成是傳統相機照的底片,而物件就是洗出來的照片了,一張底片可以洗出無數張照片,而且可以有不一樣的色調。 flash actionscript 的核心,已經幫我們建立好許多實用的類別,當然,也可以自行定義類別。
物件命名原則:
_mc
(代表 MovieClip
) 、 _btn
(代表 SimpleButton
) 、 _txt
(代表 TextField
) 。 (flash cs4 以後不支援)建立新的物件,就是產生實體。使用 new
運算子 (operators) 由「類別」創建新的物件「實體」 (這好像是由類別產生的化身) ;搭配使用 var
定義關鍵字 (definition keywords) 為物件命名,這就稱為「變數」,加上 :
(冒號) 指定「資料型態」 (或稱類型附註 type annotation) 。如果只是使用 var
指定名稱,但未建立新實體,表示物件實體尚未產生,像似登記買地還沒有開始建設。產生新的變數名稱,也就是替所在的物件定義了新的「屬性」。程式中就像在做一件一件的工作 (指令) ,不同的工作間以 ;
(分號) 區隔。
var
名稱:資料型態 =new
類別名稱 (參數,參數,參數…) ;
var n:Number;
var i:int=0;
var str:String="邏輯";
var sd:Sound=new Sound(uriAt);
以 .
句點作「接續」,來指向在物件裡所定義的物件:物件.物件.物件。
displayA.alpha=.75;
displayA.width=100;
displayA.x+=2;
displayA.scaleY=displayA.scaleX;
函數 (或說函式) 也是一種物件,主要作用是提供可取用 (呼叫 call) 的「功能」,可以產生具體的物件,或只是執行一些工作;函數是被動的物件,就好像等待啟動的機器人,沒有叫用它就不會有任何作用。使用 function
定義關鍵字 (definition keywords) 為物件命名,加上 ()
括號及 ()
間的「參數」 (arguments ,或稱引數,非必須存在,一組以 ,
(逗號) 區隔且僅限在函數內使用的變數物件。),這就稱為「函數」,和變數一樣,再加上 :
(冒號) 指定將由函數產生資料的型態 (以 void
特殊資料型態代表不產生資料) ;接著在 {}
(大括號) 間建立一組待執行的工作,就像是一套功能。產生新的函數,就是替所在物件定義了新的「方法」。在函數裡最末行工作指令,執行 return()
方法可使函數產生資料。
function
名稱(參數:資料型態,參數:資料型態,參數…):資料型態 {一組待執行的工作指令}
function numA():Number{return(150);}
function sumA():Number{return(a+b);}
function numB(n:Number):Number{return(n*10);}
function sumB($1:Number,$2:Number):Number{return($1+$2);}
function sc(s:Number):void{displayA.scaleX+=s;displayA.scaleY=displayA.scaleX;}
displayA.stop();displayB.play();displayC.gotoAndStop(15);
displayA.x=numA();
displayA.width=numB(10);
displayA.x=sumB(50,200);
sc(0.5);
trace(sumA(),sumB(200,300));
在 flash 裡,自訂的類別必須是附檔名為 as 的獨立檔案,而套件就是類別存放的資料夾,通常會為了相同的目的,把多組類別檔整合在同一個套件 (資料夾) 內。宣告「套件名稱」其實就是指出類別所在的資料夾名稱,由於類別是在 fla 檔外部的獨立檔案,所以需要宣告套件來指出類別檔所在的資料夾 (路徑) ,如果類別檔與 fla 檔同一個資料夾就不需要路徑名稱。套件也可加點運算子 「.
」 指出子套件 (子資料夾) 。
使用 package
定義關鍵字 (definition keywords) 宣告套件名稱,接著在 {}
(大括號) 間建立類別。使用 class
定義關鍵字 (definition keywords) 為「類別」命名,可接著使用 extends
定義關鍵字 (definition keywords) 指定本身作為另一類別的延伸類別 (或稱子類別) ;再接著在 {}
(大括號) 間定義類別的內容。類別名稱須與 as 檔主檔名相符。
package libs.display{//宣告套件名稱 (資料夾路徑)
import flash.text.*
public class ClassName extends Sprite{
//類別 ClassName 的內容, as 主檔名稱與類別名稱相同}
}
一個 as 來源檔案中可定義多個類別,但每個檔案中只有一個與檔案同名的類別可供該檔案外部的程式碼使用;也就是,在套件宣告區塊之中 (大括號間) 只能定義一個類別。在套件宣告區塊之後,也可以定義其它類別,但僅在該檔案內的程式碼看得見,檔案之外的程式碼無法看見這些類別。
在 flash 中,可指定套件的目錄 (類別 as 檔案的資料夾位址) 。
完整關聯套件與類別,在同一作用範圍內就不須寫出整串類別名稱,如 fl.containers.UILoader
類別只須寫 UILoader
即可。類別名稱可以 * 星號表示某套件內所有類別。
import fl.containers.UILoader;
import fl.controls.*;
在類別或類別的屬性之前,加上前置屬性關鍵字,指出類別或屬性能夠被取用的範圍。
public class ClassName {
}
//全域可使用的類別private var i:uint;
//僅所在的類別內可存取的屬性public function methodName():void{}
//全域可存取的方法public static const YES:String="yes";
//全域可取用的靜態常數internal
:同一 (所在) 套件內。此為預設狀態。public
:全域 (任何區域範圍) 。dynamic
:可在程式「執行階段」經由實體動態產生屬性 (或方法) 。 MovieClip
類別就是典型的範例。final
:類別不可被延伸 (extend) 。internal
:同一套件內及相同套件內衍生類別。此為預設狀態,惟建構函數永遠視為 public
。public
:全域 (任何區域範圍) 。private
:同一類別內。protected
:同一類別及其衍生類別內,不同套件也可以。static
:沒有繼承性,以類別名稱參照,不能由實體 (instances) 參照;屬於類別,不屬於類別建立的實體。namespace
:自訂命名空間 (作用範圍) 。靜態方法並不與個別實體繫結,所以不能在靜態方法的宣告區塊之中使用關鍵字 this
或 super
。
與類別名稱同名的方法 (methods / functions) ,永遠視為 public ,不論有沒有前置 public 都會視為 public。
建構函數不允許傳回值,也就是說,不允許指定任何傳回資料類型。
package libs.display{
import flash.text.*
public class ClassName extends Sprite{
function ClassName(){
//建構函數,與類別名稱同名的方法}
}
}
建構函數內,使用 super() 陳述式,可明確呼叫其直屬父類別的建構函數。
import libs.display.ClassName;
var a:ClassName=new ClassName();