適用於 JavaScript 開發人員的 ActionScript 基本概念

Adobe® ActionScript® 3.0 是一種類似 JavaScript 的程式語言 — 兩者都是以 ECMAScript 為基礎。ActionScript 3.0 曾隨同 Adobe® Flash® Player 9 一起發行,因此您可以利用 ActionScript 3.0 在 Adobe® Flash® CS3 Professional、Adobe® Flash® CS4 Professional 和 Adobe® Flex™ 3 開發內容豐富的網際網路應用程式。

目前的 ActionScript 3.0 版本過去只能用於開發在瀏覽器執行之 Flash Player 9 的 SWF 內容。現在,它還可以用來開發在 Adobe® AIR® 執行的 SWF 內容。

適用於 HTML 開發人員的 Adobe AIR 參考」包含適用於 HTML 類型應用程式之 JavaScript 程式碼的類別說明。它是整個執行階段類別中的子集。執行階段中的其他類別適用於開發 SWF 類型的應用程式 (例如,定義視覺內容結構的 DisplayObject 類別)。如果您需要在 JavaScript 中使用這些類別,請參閱下列 ActionScript 文件:

ActionScript 和 JavaScript:之間的差異:概觀

如同 JavaScript,ActionScript 也是依據 ECMAScript 語言規格,因此兩種語言具有共通的核心語法。例如,下列程式碼在 JavaScript 和 ActionScript 功能相同:

var str1 = "hello"; 
var str2 = " world."; 
var str = reverseString(str1 + str2); 
     
function reverseString(s) { 
    var newString = ""; 
    var i; 
    for (i = s.length - 1; i >= 0; i--) { 
        newString += s.charAt(i); 
    } 
    return newString; 
}

不過,兩個語言在語法及作業方式上有所差異。例如,前述程式碼範例可以改寫成下列 ActionScript 3.0 (SWF 檔):

function reverseString(s:String):String { 
    var newString:String = ""; 
    for (var i:int = s.length - 1; i >= 0; i--) { 
        newString += s.charAt(i); 
    } 
    return newString; 
}

Adobe AIR 之 HTML 內容支援的 JavaScript 版本為 JavaScript 1.7。本主題將詳細說明 JavaScript 1.7 和 ActionScript 3.0 之間的差異。

執行階段包含一些提供進階功能的內建類別。在執行階段,HTML 頁面中的 JavaScript 可以存取那些類別。ActionScript (在 SWF 檔中) 和 JavaScript (在瀏覽器中執行的 HTML 檔中) 都可以使用那些執行階段類別。不過,目前這些類別的 API 文件 (未包含在「適用於 HTML 開發人員的 Adobe AIR 參考」中) 是以 ActionScript 語法進行說明。換句話說,如需某些執行階段的進階功能相關資訊,請參閱「Adobe® Flash® Professional CS5 的 ActionScript® 3.0 參考」。瞭解 ActionScript 的基本概念可以協助您瞭解如何在 JavaScript 中使用這些執行階段類別。

例如,下列 JavaScript 程式碼可播放 MP3 檔的音樂。

var file = air.File.userDirectory.resolve("My Music/test.mp3"); 
var sound = air.Sound(file); 
sound.play();

程式碼中每一行都是從 JavaScript 呼叫執行階段功能。

在 SWF 檔,下列 ActionScript 程式碼可以存取這些執行階段功能:

var file:File = File.userDirectory.resolve("My Music/test.mp3"); 
var sound = new Sound(file); 
sound.play();

ActionScript 3.0 資料類型

ActionScript 3.0 是一種強型別語言。這表示您可以對變數指定資料類型。例如,前述範例的第一行可以撰寫如下:

var str1:String = "hello";

在此處,str1 變數宣告為 String 類型。後續所有對 str1 變數進行的指派,都是對變數指派 String 值。

您可以指定變數、函數之參數的類型,以及函數的傳回類型。因此,上一個範例中的函數宣告在 ActionScript 中看起來如下:

function reverseString(s:String):String { 
       var newString:String = ""; 
       for (var i:int = s.length - 1; i >= 0; i--) { 
           newString += s.charAt(i); 
       } 
       return newString; 
}
備註: s 參數和函數的傳回值都是指派為 String 類型。

雖然指派類型在 ActionScript 中為選擇性的,但對物件宣告類型卻有下列優點:

  • 具有類型的物件不僅允許在執行階段進行資料類型檢查,在嚴謹模式下編譯期間還可以進行資料類型檢查。在編譯期間進行類型檢查有助於識別錯誤。(嚴謹模式是一個編譯器選項。)

  • 使用具有類型的物件可以建立更有效率的應用程式。

    因此,ActionScript 文件中的範例使用資料類型。通常,您只要移除類型宣告 (例如 ":String"),便可以將範例 ActionScript 程式碼轉換為 JavaScript。

對應至自訂類別的資料類型

ActionScript 3.0 物件可以擁有對應至最上層類別的資料類型,例如 String、Number 或 Date。

在 ActionScript 3.0,您可以定義自訂類別。每一個自訂類別還定義資料類型。這表示 ActionScript 變數、函數參數或函數傳回值可以有由類別定義的類型附註。如需詳細資訊,請參閱自訂 ActionScript 3.0 類別

void 資料類型

針對不會傳回任何值的函數,void 資料類型將做為該函數的傳回值。(沒有 return 陳述式的函數就不會傳回任何值。)

* 資料類型

使用星號字元 (*) 當做資料類型和不指派資料類型同義。例如,下列函數包含一個參數 n 和一個傳回值,兩者都沒有指派的資料類型。

function exampleFunction(n:*):* { 
       trace("hi, " + n); 
}

使用 * 當做資料類型並非定義資料類型。在 ActionScript 3.0 程式碼中使用星號明確表示未定義資料類型。

ActionScript 3.0 類別、套件和命名空間

ActionScript 3.0 包含 JavaScript 1.7 中未提供之類別的相關功能。

執行階段類別

執行階段包含的內建類別中有些亦包含在標準 JavaScript 中,例如,Array、Date、Math 和 String 類別 (以及其他類別)。不過,執行階段還包含標準 JavaScript 未提供的類別。這些額外類別用途非常廣泛,包括播放多樣化媒體 (例如音效) 以及和通訊端互動。

大部分執行階段類別包含在 flash 套件中,或是包含在 flash 套件的某個套件中。套件是一種組織 ActionScript 3.0 類別的方法 (請參閱 ActionScript 3.0 套件

自訂 ActionScript 3.0 類別

ActionScript 3.0 允許開發人員自行建立自訂類別。例如,下列程式碼定義一個名為 ExampleClass 的自訂類別。

public class ExampleClass { 
    public var x:Number; 
    public function ExampleClass(input:Number):void { 
        x = input; 
    } 
    public function greet():void { 
        trace("The value of x is: ", x); 
    } 
}

這個類別具有下列成員:

  • 建構函式方法 ExampleClass(),可讓您實體化 ExampleClass 類型的新物件。

  • 公用屬性 x (類型為 Number),可讓您取得和設定 ExampleClass 類型的物件。

  • 公用方法 greet(),可讓您對 ExampleClass 類型的物件進行呼叫。

    在此範例中,x 屬性和 greet() 方法都是位於 public 命名空間。public 命名空間會使類別外部的物件和類別可以存取方法和屬性。

ActionScript 3.0 套件

套件提供安排 ActionScript 3.0 類別的方法。例如,許多與處理電腦檔案和目錄相關的類別都包含在 flash.filesystem 套件中。在這種情況下,flash 是一個包含其他套件、檔案系統的套件。該套件可能包含其他類別或套件。事實上,flash.filesystem 套件包含下列類別:File、FileMode 和 FileStream。若要在 ActionScript 中參照 File 類別,您可以撰寫如下:

flash.filesystem.File

內建和自訂類別都可以放入套件中。

當您從 JavaScript 參考 ActionScript 套件時,請使用特定的 runtime 物件。例如,下列程式碼可以在 JavaScript 中實體化新的 ActionScript File 物件:

var myFile = new air.flash.filesystem.File();

在此處,File() 方法是對應至同名類別 (File) 的建構函數。

ActionScript 3.0 命名空間

在 ActionScript 3.0,命名空間定義可以存取類別中之屬性和函數的範圍。

只有在 public 命名空間中的屬性和方法才可用於 JavaScript。

例如,File 類別 (位於 flash.filesystem 套件) 包含 public 屬性和方法,例如 userDirectoryresolve()。兩者都可以當作 JavaScript 變數的屬性,用來實體化 File 物件 (透過 runtime.flash.filesystem.File() 建構函式方法)。

有四個預先定義的命名空間:

命名空間

說明

public

任何實體化某個類型之物件的程式碼,都可以存取定義該類型之類別中的 public (公用) 屬性和方法。此外,任何程式碼都可以存取公用類別的公用靜態屬性和方法。

private

指定為 private (私有) 的屬性和方法僅可用於類別內的程式碼。它們不可以當作該類別定義之物件的屬性或方法來存取。私有命名空間中的屬性和方法不可用於 JavaScript。

protected

指定為 protected (保護) 的屬性和方法僅可用於類別定義中的程式碼以及繼承自該類別的類別。保護命名空間中的屬性和方法不可用於 JavaScript。

internal

同一套件內的任何呼叫者都可以使用指定為 internal (內部) 的屬性和方法。依預設,類別、屬性和方法屬於內部命名空間。

此外,自訂類別可以使用 JavaScript 程式碼不可使用的其他命名空間。

ActionScript 3.0 函數中的必要參數和預設值

ActionScript 3.0 和 JavaScript 兩者的函數都可以包含參數。在 ActionScript 3.0,參數可以是必要或選用,但是在 JavaScript,參數永遠為選用。

下列 ActionScript 3.0 程式碼定義一個 n 為必要參數的函數。

function cube(n:Number):Number { 
    return n*n*n; 
}

下列 ActionScript 3.0 程式碼定義必須要有 n 參數的函數。該函數同時包括選用的 p 參數,其預設值為 1:

function root(n:Number, p:Number = 1):Number { 
    return Math.pow(n, 1/p); 
}

ActionScript 3.0 函數還可以接受不定個數的引數,指定方法是在參數清單尾端加入 ...rest 語法,如以下所示:

function average(... args) : Number{ 
    var sum:Number = 0; 
    for (var i:int = 0; i < args.length; i++) { 
        sum += args[i]; 
    } 
    return (sum / args.length); 
}

ActionScript 3.0 事件偵聽程式

在 ActionScript 3.0 程式設計中,所有事件都是用「事件偵聽程式」來處理。 事件偵聽程式是一種函數。當物件傳送事件時,事件偵聽程式會回應該事件。該事件 (一個 ActionScript 物件) 會被當做函數的參數傳遞至事件偵聽程式。這一點和 JavaScript 中使用的 DOM 事件模型不同。

例如,當您呼叫 Sound 物件的 load() 方法 (來載入 mp3 檔) 時,Sound 物件會嘗試載入該音效。然後 Sound 物件會傳送下列任一事件:

事件

說明

complete

當資料成功載入時。

id3

當 mp3 ID3 資料為可用時。

ioError

當發生輸入/輸出錯誤導致載入作業失敗時。

open

當載入作業開始時。

progress

當收到載入作業進度資料時。

任何可以傳送事件的類別都是延伸 EventDispatcher 類別或實作 IEventDispatcher 介面 。(ActionScript 3.0 介面是一種資料類型,用來定義一組類別可實作的方法。) 在 ActionScript 語言參考中,這些類別的每一個類別列表內,都有一個該類別可以傳送之事件的清單。

您可以使用傳送事件之物件的 addEventListener() 方法,來註冊處理所有這些事件的事件偵聽程式函數。例如,在 Sound 物件這個例子中,您可以註冊 progresscomplete 事件,如下列 ActionScript 程式碼範例所示:

var sound:Sound = new Sound(); 
var urlReq:URLRequest = new URLRequest("test.mp3"); 
sound.load(urlReq); 
sound.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
sound.addEventListener(Event.COMPLETE, completeHandler); 
 
function progressHandler(progressEvent):void { 
      trace("Progress " + progressEvent.bytesTotal + " bytes out of " + progressEvent.bytesTotal); 
} 
 
function completeHandler(completeEvent):void { 
      trace("Sound loaded."); 
}

在執行於 AIR 的 HTML 內容中,您可以註冊 JavaScript 函數來當作事件偵聽程式。下列程式碼可加以說明。(此程式碼假設 HTML 文件包含一個名為 progressTextArea 的 TextArea 物件。)

var sound = new runtime.flash.media.Sound(); 
var urlReq = new runtime.flash.net.URLRequest("test.mp3"); 
sound.load(urlReq); 
sound.addEventListener(runtime.flash.events.ProgressEvent.PROGRESS, progressHandler); 
sound.addEventListener(runtime.flash.events.Event.COMPLETE, completeHandler); 
 
function progressHandler(progressEvent) { 
      document.progressTextArea.value += "Progress " + progressEvent.bytesTotal + " bytes out of " + progressEvent.bytesTotal; 
} 
 
function completeHandler(completeEvent) { 
      document.progressTextArea.value += "Sound loaded.";