JavaScript 開発者のための ActionScript の基礎



ActionScript™ 3.0 は JavaScript に似たプログラミング言語です。どちらも ECMAScript に基づいています。Adobe® Flash® Player 9 でリリースされた ActionScript 3.0 を使用すると、Adobe® Flash® CS3 Professional と Adobe® Flex™ 3 の両方でリッチインターネットアプリケーションを開発できます。

現行バージョンの ActionScript 3.0 は、ブラウザの Flash Player 9 用 SWF コンテンツの開発時にのみ使用できました。今回、Adobe® AIR™ で実行する SWF コンテンツの開発時にも使用できるようになりました。

Adobe AIR Language Reference for HTML Developers』には、HTML ベースのアプリケーションの JavaScript コードで役立つクラスの情報が含まれています。これは、ランタイムのクラスセット全体のサブセットです。ランタイムの他のクラス(ビジュアルコンテンツの構造を定義する DisplayObject クラスなど)は、SWF ベースのアプリケーションの開発に役立ちます。これらのクラスを JavaScript で使用する際は、次に示す ActionScript マニュアルを参照してください。

ActionScript と JavaScript の相違点について

ActionScript は、JavaScript と同じ 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; 
}

しかし、これら 2 つの言語のシンタックスと機能には相違点もあります。例えば、前述のコード例は 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 ドキュメント(『Adobe AIR Language Reference for HTML Developers』には含まれていません)では、ActionScript のシンタックスを使用して説明されています。したがって、ランタイムの一部の高度な機能については、『Adobe AIR ActionScript 3.0 Language Reference』を参照してください。ActionScript に関する基礎知識は、JavaScript におけるこれらのランタイムクラスの使用方法を理解するのに役立ちます。

例として、MP3 ファイルのサウンドを再生する JavaScript コードを次に示します。

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

これらの各コード行では、JavaScript のランタイム機能が呼び出されます。

SWF ファイルでは、次に示す ActionScript コードでこれらのランタイム機能にアクセスできます。

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

ActionScript 3.0 のデータ型

ActionScript 3.0 は、厳密な型指定を行う言語です。つまり、1 つの変数に 1 つのデータ型を割り当てることができます。例えば、前述の例の第 1 行は次のように記述することもできます。

var str1:String = "hello";

ここでは、str1 変数が String 型として宣言されています。後続のすべての str1 変数には、ストリング値が割り当てられます。

変数、関数のパラメータ、関数の戻り値の型に対して、型を割り当てることができます。したがって、前述の例における関数の宣言を 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 に存在しないクラスに関する機能が含まれています。

ランタイムクラス

Array、Date、Math、String など、ランタイムに組み込まれているクラスの多くは、標準の JavaScript にも含まれています。しかし、標準の 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 名前空間にあるので、クラス外部のオブジェクトやクラスからもアクセスできます。

ActionScript 3.0 のパッケージ

パッケージは、ActionScript 3.0 クラスを整理する手段を提供します。例えば、AIR アプリケーションがインストールされているコンピュータ上のファイルやディレクトリの操作に関連する多くのクラスは、flash.filesystem パッケージに含まれています。この場合、flash というパッケージの中に、filesystem という別のパッケージが含まれています。さらに、そのパッケージに他のクラスやパッケージが含まれていることもあります。実際、この 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 で使用できます。

例えば、(flash.filesystem パッケージ内の)File クラスに含まれるパブリックプロパティとメソッドには、userDirectoryresolve() などがあります。どちらも、File オブジェクトを(runtime.flash.filesystem.File() コンストラクタメソッド経由で)インスタンス化する JavaScript 変数のプロパティとして使用できます。

定義済みの名前空間には、次の 4 つがあります。

名前空間

説明

public

ある型のオブジェクトをインスタンス化するコードでは、その型を定義しているクラス内のパブリックプロパティとパブリックメソッドにアクセスできます。また任意のコードで、public クラスのパブリック静的プロパティとパブリック静的メソッドにアクセスできます。

private

private に指定されたプロパティとメソッドは、クラス内部のコードでのみ使用できます。そのクラスで定義されたオブジェクトのプロパティやメソッドとしてアクセスすることはできません。private 名前空間のプロパティとメソッドは、JavaScript で使用することができません。

protected

protected に指定されたプロパティとメソッドは、クラス定義内のコードと、そのクラスを継承するクラスでのみ使用できます。protected 名前空間のプロパティとメソッドは、JavaScript で使用することができません。

internal

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 オブジェクトではサウンドの読み込みを試みた後、次に示すイベントのいずれかの送出を試みます。

イベント

説明

complete

データが正常に読み込まれたときに送出されます。

id3

MP3 ID3 データが使用可能なときに送出されます。

ioError

入出力エラーが発生して読み込み操作が失敗したときに送出されます。

open

読み込み操作が開始されたときに送出されます。

progress

読み込み処理の実行中にデータを受信したときに送出されます。

イベントを送出できるクラスは、EventDispatcher クラスを拡張するか、IEventDispatcher インターフェイスを実装します(ActionScript 3.0 インターフェイスは、クラスで実装できる各種メソッドを定義するために使用されるデータ型です)。『ActionScript リファレンスガイド』のこれらのクラスの項目には、各クラスで送出可能なイベントの一覧が記載されています。

これらのイベントを処理するイベントリスナー関数を登録するには、イベントを送出するオブジェクトの addEventListener() メソッドを使用します。例えば Sound オブジェクトの場合、次の ActionScript コードに示すように、progress イベントと complete イベントを登録できます。

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.";