[ActionScript 3.0] Objectクラスやdynamic class

【追記】
2011年7月24日 :オブジェクトリテラル

Objectクラスに動的にプロパティを追加して連想配列的に使う場合、プロパティ名(キー)に指定したオブジェクトは、あくまでその文字列表現が適用される(String()やtoString()から出力されるもの)。

			var obj:Object = new Object;
			obj[123] = "num";
			obj["123"] = "string";
			
			trace(obj[123]); // 内部で文字列"123"に変換される
			trace(obj["123"]);
			
			for (var key:String in obj) {
				trace(key);
			}
			
			// プロパティ(キー)が数字で始まる場合、ドット演算子ではアクセスできない
			// trace(obj.123); コンパイルエラー

プロパティにオブジェクト型を指定した場合、 [object ClassName]という文字列が適用されるため、 値を得るときはその文字列を直接指定できる。

			var obj:Object = new Object;
			obj[new Sprite] = "sprite";
			obj[new Shape] = "shape";
			
			for (var key:String in obj) {
				trace(key);
			}
			/* output :
				[object Sprite]
				[object Shape]
			*/
			
			// プロパティにオブジェクト型を指定した場合、
			// [object ClassName]という文字列が適用されるため、
			// 値を得るときはその文字列を直接指定できる
			trace(obj["[object Sprite]"]); // output : sprite
			
			// インスタンスを指定しても同じ
			var spr:Sprite = new Sprite;
			trace(obj[spr]); // output : sprite
			trace(obj[spr.toString()]); // output : sprite

以上のことは動的クラス(dynamic class)でも同じ。

	public dynamic class DynamicSample{}

			// Objectクラスだけでなく、動的クラスでも同じ
			var sample:DynamicSample = new DynamicSample;
			sample[123] = "num";
			
			trace(sample["123"]); // output : num

オブジェクトリテラルを使って初期化する場合、キーは文字列定数(" “)を使わなくても直接文字列や数値を指定できる。

var obj:Object = { "x" : 0, y : 1, 32 : 3 };

ただし、たとえ文字列であっても、変数に格納された値や関数・メソッドの返り値を指定することはできない。

var num = 5;
var obj:Object = { num : 5, Sample.num : 6, parseInt("32") : 7 };

上記の場合、numは値の5ではなく"num"という文字列がキーとして使われ、それ以外はコンパイルエラーとなる。

オブジェクトの参照をキーにした連想配列(動的コレクション)を使いたい場合は、Dictionaryクラスを使う。