4.4 ダイナミッククラス
4.4 ダイナミッククラス
ダイナミッククラスを作る
ダイナミッククラスとは、スクリプトを実行している最中にクラスメンバーやインスタンスメンバーを追加することができるクラスです。ダイナミッククラスを作るには、クラス定義の際にdynamicキーワードを指定します。
次のMyClassクラスにはコンストラクタ以外はプロパティもメソッドも定義してありませんが、dynamicキーワードでダイナミッククラスに指定してあることからムービーの再生中にメンバーを追加することができます。
sample→ex04-04/dynamicフォルダ
クラス定義ファイル:MyClass.as
dynamic class MyClass {
//コンストラクタ
function MyClass() {
}
}
インスタンスメンバーを追加する
たとえば、次のフレームアクションをテストするとMyClassクラスで作ったインスタンスaObj、bObjのそれぞれにpriceプロパティが追加されて150と200の値が割り当てられたことがわかります。
フレームアクション:myclasstest1.fla
//インスタンスを作る
var aObj:MyClass = new MyClass();
var bObj:MyClass = new MyClass();
//インスタンスプロパティを追加する
aObj.price = 150;
bObj.price = 200;
//追加したインスタンスプロパティを確認する
trace(aObj.price); // 出力→ 150
trace(bObj.price); // 出力→ 200
続けて次のようにaObjにインスタンスメソッドurine()を追加し、試しにaObjとbObjの両方のインスタンスでurine()を実行します。
//インスタンスメソッドを追加する
aObj.urine = function() {
var v = this.price * 1.2;
return v;
};
//追加したインスタンスメソッドを試す
trace(aObj.urine());// 出力→ 180
trace(bObj.urine());// 出力→ undefined
確かにaObjインスタンスにはurine()メソッドが追加されていますが、bObjインスタンスではurine()メソッドが利用できません。インスタンスメンバーというものは、プロパティもメソッドもインスタンスごとに保有しているものであることがこれでもわかります。
クラスメンバーを追加する
ダイナミッククラスではクラスメンバーを追加することもできます。先のMyClassクラスにクラスメンバーを追加してみましょう。クラスメンバーの追加は、クラス名に対してプロパティやメソッドを直接設定します。次の例ではxプロパティとfx()メソッドを追加し、追加が成功したかどうかを続けてテストしています。
フレームアクション:myclasstest2.fla
//クラスメンバーを追加する
MyClass.x = 120;
MyClass.fx = function(v:Number) {
var ans = v * 3;
return ans;
};
//追加したクラスメンバーをテストする
trace(MyClass.x);// 出力→ 120
trace(MyClass.fx(15));// 出力→ 45
ダイナミッククラスのビルトインクラス
Objectクラスはインスタンスにプロパティやメソッドを追加するといった使い方をします。ムービークリップシンボルのインスタンスの場合も同様です。それはObjectクラスやMovieClipクラスがダイナミッククラスだからです。これらのクラスにはインスタンスメンバーだけでなくクラスに対してクラスメンバーを追加することもできます。
ビルトインクラスの中でダイナミッククラスであるものには、Array、ContextMenu、ContextMenuItem、Function、LoadVars、MoviwClip、NetConnection、Object、SharedObject、TextFieldといったクラスがあります。