ふと思いついて、下記のコードを実行してみました。
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
/**
* ...
* @author MoNoQLoREATOR
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var arr:Array = new Array();
var tf1:TextField = new TextField();
tf1.text = "tf1";
var tf2:TextField = new TextField();
tf2.text = "tf2";
arr.push(tf1);
tf1 = tf2;
trace( (arr[0] as TextField).text);
}
}
}
これは、Array型変数がtf1が示す中身を持っているということを表しています。
よってtf1にインスタンスを代入し直してもそれはArray型変数には全く干渉しません。
と、いうことは、参照への参照を保持する変数を作るには、Object型変数をメンバに持つクラスを作ってそれを使って参照を管理するメンバ関数と、参照の参照を管理するメンバ関数を使い分けて…といったことをやらないといけないということに。(ActionScriptではプリミティブ型以外の全ての型がObject型を継承していることが保証されています)
多分今までのActionScript3プログラミングで詰まってた原因はこれですね…orz
なにはともあれ重要なことに気づいて良かったです。