3.0で互いに参照する場合について説明します。メインタイムラインに3つのMovieClipインスタンスmy1_mc、test_mc、my2_mcを、この重ね順に配置します。3つのインスタンスは、わかりやすいようにそれぞれレイヤーに分け、レイヤーにはインスタンス名を設定しました(図001)。メインタイムラインから子のインスタンスを参照するまず、メインタイムラインのフレームアクションで、子のMovieClipインスタンスを参照してみます。3.0では、子のインスタンスは親インスタンスの表示リストに加えられます。表示リスト内のインスタンスの数はDisplayObjectContainer.numChildrenプロパティで調べられ、DisplayObjectContainer.getChildAt()メソッドにインデックスを指定してインスタンスが取出せます。以下のスクリプト001をメインタイムラインのフレームアクションとして記述すると、配置された3つのMovieClipインスタンスの情報が[出力]パネルに表示されます。DisplayObjectContainer.getChildIndex()メソッドは、指定したインスタンスの表示リスト内におけるインデックスを返します[*1]。this.getChildIndex(_mc));}[ムービープレビュー]を確かめると、3つのMovieClipインスタンスの名前やインデックス番号が[出力]パネルに表示されます(図002)。インデックス番号は0から始まり、重ね順(レイヤー)が上になるほど値は大きくなります。上記スクリプト001では、DisplayObjectContainer.getChildIndex()メソッドは、DisplayObjectContainer.getChildAt()メソッドに渡したインデックス(i)と同じ値を返します。この値は、念のため[出力]に加えています。子のインスタンスから同階層のインスタンスを参照するつぎは、子のインスタンスから、同階層の他のインスタンスを参照します。メインタイムラインから子のインスタンスを参照する」と同じ要領で、メインタイムラインに配置された3つのインスタンスが参照できるはずです。以下のスクリプト002を、MovieClipインスタンスtest_mcの第1フレームアクションとして記述します。parent.getChildIndex(_mc));}前記スクリプト001も残しておくと、まずメインタイムラインのフレームアクションが先に実行され、そのあとMovieClipのフレームアクション(スクリプト002)が処理されることになります。[出力]されるインスタンスの情報は、どちらのスクリプトも同じになります(図003)。MovieClipシンボルに設定したクラスから同階層のインスタンスを参照する今度は、ひとつのMovieClip(test_mc)のシンボルにクラスMyClassを設定します(図004)。処理内容は、前記スクリプト002と同じく、同階層のインスタンスを参照するというものです。クラスのコンストラクタメソッドから実行します。図004■MovieClipシンボルにクラスを設定クラスMyClassの定義は、以下のスクリプト003のとおりです。コンストラクタメソッドにおける処理は、基本的に前記スクリプト002と変わりません。trace()関数で各インスタンスの情報を[出力]する前に、それがDisplayObject(またはそのサブクラス)のインスタンスであることを確かめ、そうでない場合には[出力]する項目を減らしました。その理由は、[ムービープレビュー]で実際に[出力]内容を見るとわかります(図005)。_mc);}}}}}コンストラクタメソッドから参照すると、親インスタンスの表示リスト内のインデックス2がnullとして返されています。nullの参照に対してプロパティにアクセスしようとしたり、あるいはDisplayObjectContainer.getChildIndex()メソッドに引数としてnullを渡すと、ランタイムエラーになります。そのため、上記スクリプト003では、表示リストから取出した参照が、DisplayObjectインスタンスであることを確かめたのです。図005■クラスのコンストラクタから参照すると前面のインスタンスはnullになるMovieClipシンボルに設定したクラスのコンストラクタメソッドは、メインタイムラインの第1フレームアクションよりも先に呼出されます(上図005参照)。コンストラクタはインスタンスを初期化します。その呼出しの順序は、表示リスト内のインデックス0から順に値の大きいインスタンス、つまり重ね順の背面から前面になります。したがって、コンストラクタが呼出されたとき、インデッスクの大きいインスタンスはまだ初期化されていません。そのため、参照を取得しても値がnullになってしまうのです[*2]。よって、MovieClipシンボルに設定したクラスから同じ階層のインスタンスを参照するには、その実行を少し遅らせる必要があります。具体的には、DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)にリスナー関数を登録して、その関数からそれらのインスタンスにアクセスすればよいでしょう(スクリプト004)。onEnterFrame);}}}DisplayObject.enterFrameイベントに登録されたリスナー関数はタイムラインの第1フレームアクションの後に呼出されますので、表示リスト内のインデックスにかかわらず同階層のインスタンスを参照することができます(図005)。スクリプト003の[出力](上図005)からは、初期化前のインスタンスもDisplayObjectContainer.numChildrenの数には含まれていることがわかります。