ActionScript 3.0 は旧バージョンの ActionScript をベースに構築されているため、ActionScript オブジェクトモデルがどのように進化してきたかを理解しておくと役立ちます。 ActionScript は、Flash Professional の初期バージョン用の単純なスクリプトメカニズムとして誕生しました。その後、プログラマーは ActionScript を使用してより複雑なアプリケーションを作成するようになりました。プログラマーのニーズに応えるために、その後の各リリースには複雑なアプリケーションの作成を容易にする言語機能が追加されてきました。
ActionScript 1.0
ActionScript 1.0 は、Flash Player 6 以前で使用されていたプログラミング言語のバージョンです。この開発初期段階でも、ActionScript オブジェクトモデルは基本的なデータ型としてのオブジェクトの概念をベースにしていました。 ActionScript オブジェクトは、プロパティのグループを持つ複合データ型です。オブジェクトモデルについて説明するとき、プロパティという用語には、変数、関数、メソッドなど、オブジェクトに関連付けられるあらゆるものが含まれます。
第 1 世代の ActionScript では、
class
キーワードによるクラスの定義はサポートされていませんが、プロトタイプオブジェクトと呼ばれる特殊なオブジェクトを使用してクラスを定義できます。
class
キーワードを使用して具象オブジェクトにインスタンス化する抽象クラスの定義を作成する、Java や C++ などのクラスベース言語の場合と異なり、ActionScript 1.0 のようなプロトタイプベース言語では、既存オブジェクトを他のオブジェクトのモデル(またはプロトタイプ)として使用します。クラスベース言語のオブジェクトはテンプレートになるクラスを示す場合がありますが、プロトタイプベース言語のオブジェクトはテンプレートになる別のオブジェクト、つまりプロトタイプを示します。
ActionScript 1.0 でクラスを作成するには、クラスのコンストラクター関数を定義します。 ActionScript の関数は、単に抽象的な定義ではなく実際のオブジェクトです。 作成したコンストラクター関数は、そのクラスのインスタンスのプロトタイプ的なオブジェクトになります。 次のコードでは、Shape という名前のクラスを作成し、デフォルトで
true
に設定される
visible
というプロパティを 1 つ定義します。
// base class
function Shape() {}
// Create a property named visible.
Shape.prototype.visible = true;
このコンストラクター関数は、
new
演算子でインスタンス化できる Shape クラスを次のように定義します。
myShape = new Shape();
Shape()
コンストラクター関数オブジェクトが Shape クラスのインスタンスのプロトタイプとして機能するのと同様に、これは Shape のサブクラスのプロトタイプ、すなわち Shape クラスを拡張する他のクラスとしても機能します。
Shape クラスのサブクラスであるクラスを作成するには、次の 2 つの手順を実行します。 最初に、次のようにクラスのコンストラクター関数を定義して、クラスを作成します。
// child class
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
次に、
new
演算子を使用して、Shape クラスが Circle クラスのプロトタイプであると宣言します。デフォルトでは、作成したクラスはそのプロトタイプとして Object クラスを使用します。つまり、現時点では、
Circle.prototype
には汎用オブジェクト(Object クラスのインスタンス)が含まれています。Circle のプロトタイプに Object ではなく Shape を指定するには、汎用オブジェクトではなく Shape オブジェクトが含まれるように、次のコードを使用して
Circle.prototype
の値を変更します。
// Make Circle a subclass of Shape.
Circle.prototype = new Shape();
これで、Shape クラスと Circle クラスは、プロトタイプチェーンと呼ばれる継承関係内で相互にリンクされました。次の図は、プロトタイプチェーン内の関係を示しています。
各プロトタイプチェーンの最後にある基本クラスは Object クラスです。 Object クラスには、ActionScript 1.0 で作成されたすべてのオブジェクトの基本プロトタイプオブジェクトを参照する
Object.prototype
という静的プロパティが含まれています。このプロトタイプチェーン例の次のオブジェクトは Shape オブジェクトです。これは、
Shape.prototype
プロパティは明示的に設定されていないので、依然として汎用オブジェクト(Object クラスのインスタンス)を保持しているからです。このプロトタイプチェーンの最後のリンクは Circle クラスで、それ自体のプロトタイプである Shape クラスにリンクされています。
Circle.prototype
プロパティは Shape オブジェクトを保持します。
次の例に示すように、Circle クラスのインスタンスを作成すると、インスタンスは Circle クラスのプロトタイプチェーンを継承します。
// Create an instance of the Circle class.
myCircle = new Circle();
以前に、Shape クラスのメンバーとして、
visible
という名前のプロパティを作成しました。この例では、
visible
プロパティは、
myCircle
オブジェクトの一部としてではなく Shape オブジェクトのメンバーとしてのみ存在しますが、次のコード行では
true
が出力されます。
trace(myCircle.visible); // output: true
ランタイムでは、プロトタイプチェーン内を移動することにより、
myCircle
オブジェクトが
visible
プロパティを継承することを確認できます。このコードを実行すると、ランタイムは最初に
myCircle
オブジェクトのプロパティから
visible
というプロパティを検索しますが、このプロパティは見つかりません。次に
Circle.prototype
オブジェクトを検索しますが、やはり
visible
というプロパティは見つかりません。ランタイムは、プロトタイプチェーン内を引き続き検索し、最後に
Shape.prototype
オブジェクトで定義された
visible
プロパティを見つけ、そのプロパティの値を出力します。
簡潔にするために、ここでは、プロトタイプチェーンの詳細および複雑さに関する説明の多くを省略します。代わりに ActionScript 3.0 オブジェクトモデルの理解に役立つ情報を提供します。
ActionScript 2.0
ActionScript 2.0 では、Java や C++ などのクラスベース言語の経験がある方には使い慣れた方法でクラスを定義できる
class
、
extends
、
public
、
private
などの新しいキーワードが導入されました。基礎となる継承メカニズムは ActionScript 1.0 と ActionScript 2.0 で変わりがないことを理解する必要があります。ActionScript 2.0 では、クラスの定義に使用する新しいシンタックスが追加されたにすぎません。プロトタイプチェーンは、両方の言語バージョンで同じように機能します。
次の抜粋に示すように ActionScript 2.0 で導入された新しいシンタックスでは、より直観的な方法でクラスを定義できます。
// base class
class Shape
{
var visible:Boolean = true;
}
ActionScript 2.0 では、コンパイル時の型チェックに使用するための型注釈も導入されました。 これにより、前述の例の
visible
プロパティにはブール値だけが含まれることを宣言できます。また、新しい
extends
キーワードにより、サブクラスを作成するプロセスが簡略化されます。次の例では、ActionScript 1.0 では 2 つの手順が必要なプロセスが、
extends
キーワードにより 1 つの手順で実行されています。
// child class
class Circle extends Shape
{
var id:Number;
var radius:Number;
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
}
コンストラクターは、クラス定義の一部として宣言されるようになりました。また、クラスプロパティ
id
および
radius
は明示的に宣言する必要があります。
ActionScript 2.0 ではインターフェイス定義のサポートも追加され、オブジェクト間の通信用に正式に定義されたプロトコルでオブジェクト指向プログラムをさらに改良できるようになりました。