Macromedia Flash非公式テクニカルノート

for...inループについて

ID: FN0110003 Product: Flash

Platform: All
Version: 5.0

1. for...inはオブジェクトのプロパティを処理
'for...in'アクションを使うと、オブジェクトに設定されたプロパティを取り出して、そのすべてに対して処理を実行することができます。取り出されるプロパティには、変数や配列要素、オブジェクト('function'も含む)などがあります。ユーザー定義のプロパティはすべて調べられます。けれど、組み込みのメソッドやプロパティは、基本的に取り出すことができません。

シンタックス
for (変数名 in オブジェクト) {
   ステートメント;
}

'for...in'アクションは、オブジェクトから順にプロパティを取り出して、その名前を変数に代入します。そのプロパティ名を使って、オブジェクトのプロパティを調べたり、処理を行うことができます。プロパティを調べるには、オブジェクトに対して[]演算子を使い、変数に代入されたプロパティ名をストリングで指定します。たとえば、以下のスクリプトは、そのタイムライン(MovieClip)に設定されたすべてのプロパティ名とプロパティ、プロパティのデータ型の組合わせを、配列として出力ウィンドウに表示します。

for (prop in this) {
   trace ([prop, this[prop], typeof (this[prop])]);
}

なお、'for...in'アクションで変数に代入されるプロパティの順序は、規定されていません。また、その順序を指定する方法も提供されてはいません。

2. タイムライン(MovieClip)に定義された変数
「ダイナミックテキスト」や「テキスト入力」に設定したテキストボックスは、変数名をつけて、ユーザー定義変数として扱うことができます。ただし、テキストボックスに何も入力されていない場合には、'for...in'アクションを使っても、変数として取り出されません。'for...in'アクションで処理できるようにするには、空白ストリング""をスクリプトで設定する方法があります(Collim Moock『ActionScript: The Definitive Guide』O'REILLY p.399)。

'var'アクションでローカル変数を宣言すると、変数値が代入されていなくても、'for...in'アクションでプロパティとして取り出されます。ですから、変数に設定された未入力のテキストボックスを'for...in'アクションで処理できるようにするには、その前に'var'アクションでローカル変数として宣言すればよいでしょう。タイムライン(MovieClip)に設定されたローカル変数は、そのMovieClipが存在する間変数値を保持します。したがって、そのMovieClipのグローバル変数と、基本的に異なるところはありません。

//未入力のテキストボックスを変数としてfor...inアクションで取り出す
var sTextField;   //テキストボックスの変数名をローカル変数に宣言
for (prop in this) {
   trace ([prop, this[prop], typeof this[prop]]);
}
//出力ウィンドウの結果
//未入力なので値はなく、未定義(undefined)
sTextField,,undefined

3. ボタンインスタンスの扱いに注意
タイムライン(MovieClip)に配置されたボタンインスタンスも、'for...in'アクションの中でプロパティとして扱われます。しかも、そのプロパティはボタンの配置されたタイムライン(MovieClip)を参照します。これは注意すべき問題です。

たとえば、以下のスクリプトは、ボタンをクリックしたとき、そのタイムラインに配置されたMovieClipすべての水平座標('_x')を右に10ピクセル移動しようとしたものと通常考えられます。ところが、'for...in'アクションの中でボタンがプロパティとして扱われ、それがボタンのあるタイムライン('this')を参照するために、その座標も移動させてしまいます。

on (release) {
   for (prop in this) {   //タイムラインのすべてのプロパティを取り出す
     if (typeof this[prop] == "movieclip") {   //プロパティがMovieClipであれば
       //ボタンインスタンスの配置されたタイムラインも参照される
       this[prop]._x += 10;   //水平座標を右に10ピクセル移動
       //ボタンのあるタイムラインも右に移動する
     }
   }
}

これを避けるには、'typeof'演算子で"movieclip"かどうかの判定に加えて、そのプロパティがボタンのあるタイムライン('this')を参照していないことをチェックすべきでしょう。

on (release) {
   for (prop in this) {
     //"movieclip"かどうかに加えて参照がthisと一致しないことを判定
     if (typeof this[prop] == "movieclip" && this[prop] != this) {
       this[prop]._x += 10;
     }
   }
}

_____

作成者: 野中文雄
協力者: Ginga Baba   Tatsuo Kato
作成日: 2001年10月4日


© 2001 and beyond Fumio Nonaka All rights reserved.