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

Adobe® ActionScript® 3.0 は JavaScript に似たプログラミング言語です。どちらも ECMAScript に基づいています。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 API リファレンスガイド には、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 ドキュメント(『 HTML 開発者用 Adobe AIR API リファレンスガイド 』には含まれていません)では、ActionScript のシンタックスを使用して説明されています。このため、ランタイムの高度な機能の一部については、『 Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド 』を参照してください。ActionScript に関する基礎知識は、JavaScript におけるこれらのランタイムクラスの使用方法を理解するのに役立ちます。

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

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 は、 厳密な型指定 を行う言語です。つまり、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 名前空間にあります。 public 名前空間によって、メソッドおよびプロパティはクラス外部のオブジェクトやクラスからもアクセスできるようになります。

ActionScript 3.0 のパッケージ

パッケージは、ActionScript 3.0 クラスを整理する手段を提供します。例えば、コンピューター上のファイルやディレクトリの操作に関連する多くのクラスは、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 クラスに含まれる パブリック プロパティとメソッドには、 userDirectory resolve() などがあります。どちらも、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 オブジェクトはサウンドの読み込みを試みます。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.";