適用於 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 3.0 物件可以擁有對應至最上層類別的資料類型,例如 String、Number 或 Date。 在 ActionScript 3.0,您可以定義自訂類別。每一個自訂類別還定義資料類型。這表示 ActionScript 變數、函數參數或函數傳回值可以有由類別定義的類型附註。如需詳細資訊,請參閱自訂 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); } } 這個類別具有下列成員:
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 屬性和方法,例如 userDirectory 和 resolve()。兩者都可以當作 JavaScript 變數的屬性,用來實體化 File 物件 (透過 runtime.flash.filesystem.File() 建構函式方法)。 有四個預先定義的命名空間:
此外,自訂類別可以使用 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 物件會傳送下列任一事件:
任何可以傳送事件的類別都是延伸 EventDispatcher 類別或實作 IEventDispatcher 介面 。(ActionScript 3.0 介面是一種資料類型,用來定義一組類別可實作的方法。) 在 ActionScript 語言參考中,這些類別的每一個類別列表內,都有一個該類別可以傳送之事件的清單。 您可以使用傳送事件之物件的 addEventListener() 方法,來註冊處理所有這些事件的事件偵聽程式函數。例如,在 Sound 物件這個例子中,您可以註冊 progress 和 complete 事件,如下列 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."; |
|