物件 (objects) 與類別 (classes)

物件由類別所建立。類別可視為建立物件的藍圖或範本,描述物件的資料型態 (data types) 及物件的特性:屬性 (變數) 與方法 (函數) ;類別也可視為一組應用程式。如果把類別想成是傳統相機照的底片,而物件就是洗出來的照片了,一張底片可以洗出無數張照片,而且可以有不一樣的色調。 flash actionscript 的核心,已經幫我們建立好許多實用的類別,當然,也可以自行定義類別。

建立物件

物件命名原則:

  1. 第一個字須為英文字母 (A-Z,a-z)、或 $、或 _ 。
  2. 不能有中文、空格、特殊用途的符號 (如 +, -, *, / …) 、內建的名稱。
  3. 同一個指定作用範圍 (如物件) 內,不能有重複使用相同的名稱。
  4. 如果需要在較舊版 flash IDE 編寫器裡自動觸發物件相關特性的提示,可將名稱加特殊「字尾」,如 _mc (代表 MovieClip) 、 _btn (代表 SimpleButton) 、 _txt (代表 TextField) 。 (flash cs4 以後不支援)

建立新實體 (instances) :變數 (variables) 與屬性 (properties)

建立新的物件,就是產生實體。使用 new 運算子 (operators) 由「類別」創建新的物件「實體」 (這好像是由類別產生的化身) ;搭配使用 var 定義關鍵字 (definition keywords) 為物件命名,這就稱為「變數」,加上 : (冒號) 指定「資料型態」 (或稱類型附註 type annotation) 。如果只是使用 var 指定名稱,但未建立新實體,表示物件實體尚未產生,像似登記買地還沒有開始建設。產生新的變數名稱,也就是替所在的物件定義了新的「屬性」。程式中就像在做一件一件的工作 (指令) ,不同的工作間以 ; (分號) 區隔。

var 名稱:資料型態 = new 類別名稱 (參數,參數,參數…) ;
  1. var n:Number;
  2. var i:int=0;
  3. var str:String="邏輯";
  4. var sd:Sound=new Sound(uriAt);

屬性的使用 (存取)

. 句點作「接續」,來指向在物件裡所定義的物件:物件.物件.物件。

  1. displayA.alpha=.75;
  2. displayA.width=100;
  3. displayA.x+=2;
  4. displayA.scaleY=displayA.scaleX;

重要的內建物件名稱

建立新功能:函數 (functions) 與方法 (methods)

函數 (或說函式) 也是一種物件,主要作用是提供可取用 (呼叫 call) 的「功能」,可以產生具體的物件,或只是執行一些工作;函數是被動的物件,就好像等待啟動的機器人,沒有叫用它就不會有任何作用。使用 function 定義關鍵字 (definition keywords) 為物件命名,加上 () 括號及 () 間的「參數」 (arguments ,或稱引數,非必須存在,一組以 , (逗號) 區隔且僅限在函數內使用的變數物件。),這就稱為「函數」,和變數一樣,再加上 : (冒號) 指定將由函數產生資料的型態 (以 void 特殊資料型態代表不產生資料) ;接著在 {} (大括號) 間建立一組待執行的工作,就像是一套功能。產生新的函數,就是替所在物件定義了新的「方法」。在函數裡最末行工作指令,執行 return()方法可使函數產生資料。

function 名稱(參數:資料型態,參數:資料型態,參數…):資料型態 {一組待執行的工作指令}
  1. function numA():Number{return(150);}
  2. function sumA():Number{return(a+b);}
  3. function numB(n:Number):Number{return(n*10);}
  4. function sumB($1:Number,$2:Number):Number{return($1+$2);}
  5. function sc(s:Number):void{displayA.scaleX+=s;displayA.scaleY=displayA.scaleX;}

方法的使用 (呼叫 call)

  1. displayA.stop();displayB.play();displayC.gotoAndStop(15);
  2. displayA.x=numA();
  3. displayA.width=numB(10);
  4. displayA.x=sumB(50,200);
  5. sc(0.5);
  6. trace(sumA(),sumB(200,300));

資料型態 (data types) 、內建類別與全域函數

全域函數 (global functions) :在任何位置都可呼叫執行。以下為一些基本的全域函數,
常見資料型態與類別
特殊資料型態
最上層 (全域) 核心類別 (core classes)
全域常數 (global constants)

套件 (packages) 與類別

在 flash 裡,自訂的類別必須是附檔名為 as 的獨立檔案,而套件就是類別存放的資料夾,通常會為了相同的目的,把多組類別檔整合在同一個套件 (資料夾) 內。宣告「套件名稱」其實就是指出類別所在的資料夾名稱,由於類別是在 fla 檔外部的獨立檔案,所以需要宣告套件來指出類別檔所在的資料夾 (路徑) ,如果類別檔與 fla 檔同一個資料夾就不需要路徑名稱。套件也可加點運算子 「.」 指出子套件 (子資料夾) 。

使用 package 定義關鍵字 (definition keywords) 宣告套件名稱,接著在 {} (大括號) 間建立類別。使用 class 定義關鍵字 (definition keywords) 為「類別」命名,可接著使用 extends 定義關鍵字 (definition keywords) 指定本身作為另一類別的延伸類別 (或稱子類別) ;再接著在 {} (大括號) 間定義類別的內容。類別名稱須與 as 檔主檔名相符。

  1. package libs.display{//宣告套件名稱 (資料夾路徑)
  2. import flash.text.*
  3. public class ClassName extends Sprite{ //類別 ClassName 的內容, as 主檔名稱與類別名稱相同
  4. }
  5. }
  6. //存成 ClassName.as 檔,並在 libs/display 資料夾下。

一個 as 來源檔案中可定義多個類別,但每個檔案中只有一個與檔案同名的類別可供該檔案外部的程式碼使用;也就是,在套件宣告區塊之中 (大括號間) 只能定義一個類別。在套件宣告區塊之後,也可以定義其它類別,但僅在該檔案內的程式碼看得見,檔案之外的程式碼無法看見這些類別。

來源路徑 (類別路徑、組建路徑)

在 flash 中,可指定套件的目錄 (類別 as 檔案的資料夾位址) 。

  1. 應用程式層級 (全域) :所有 fla 檔有作用。[偏好設定]>[ActionScript]>[語言][ActionScript3.0設定],增修[來源路徑] (或[類別路徑]) 的清單,預設就已有 flash 所有套件的資料夾。
  2. 文件層級:僅目前 fla 檔有作用。[發佈設定]>[flash]>[ActionScript版本][ActionScript3.0][設定],增修[來源路徑] (或[類別路徑]) 的清單。

import 指令

完整關聯套件與類別,在同一作用範圍內就不須寫出整串類別名稱,如 fl.containers.UILoader 類別只須寫 UILoader 即可。類別名稱可以 * 星號表示某套件內所有類別。

  1. import fl.containers.UILoader;
  2. import fl.controls.*;

作用範圍定義 (範圍鏈)

在類別或類別的屬性之前,加上前置屬性關鍵字,指出類別或屬性能夠被取用的範圍。

  1. public class ClassName {} //全域可使用的類別
  2. private var i:uint; //僅所在的類別內可存取的屬性
  3. public function methodName():void{} //全域可存取的方法
  4. public static const YES:String="yes"; //全域可取用的靜態常數

類別的屬性關鍵字

  1. internal:同一 (所在) 套件內。此為預設狀態。
  2. public:全域 (任何區域範圍) 。
  3. dynamic:可在程式「執行階段」經由實體動態產生屬性 (或方法) 。 MovieClip 類別就是典型的範例。
  4. final:類別不可被延伸 (extend) 。

類別的屬性 (或方法) 的屬性關鍵字

  1. internal:同一套件內及相同套件內衍生類別。此為預設狀態,惟建構函數永遠視為 public
  2. public:全域 (任何區域範圍) 。
  3. private:同一類別內。
  4. protected:同一類別及其衍生類別內,不同套件也可以。
  5. static:沒有繼承性,以類別名稱參照,不能由實體 (instances) 參照;屬於類別,不屬於類別建立的實體。
  6. namespace:自訂命名空間 (作用範圍) 。

靜態方法並不與個別實體繫結,所以不能在靜態方法的宣告區塊之中使用關鍵字 thissuper

類別中的建構函數 (constructors)

與類別名稱同名的方法 (methods / functions) ,永遠視為 public ,不論有沒有前置 public 都會視為 public。

建構函數不允許傳回值,也就是說,不允許指定任何傳回資料類型。

  1. package libs.display{
  2. import flash.text.*
  3. public class ClassName extends Sprite{
  4. function ClassName(){ //建構函數,與類別名稱同名的方法
  5. }
  6. }
  7. }

建構函數內,使用 super() 陳述式,可明確呼叫其直屬父類別的建構函數。

以自訂類別建立實體

  1. import libs.display.ClassName;
  2. var a:ClassName=new ClassName();