with文の名前領域 - ActionScript3.0

AS3を本気で勉強しようと思い過去に何度入門したかわからないAS3を再び始めました。今回は本気です!(ってみんな言うよね。) とりあえずTextField()から入門してHelloWorld的なことをやろうと思い頑張っていたら、with文がなかなか厄介でつまづきました。べつに使う必要ないんだけどね。

とりあえず、HelloWorld的な。

//************************************************************
// HelloWorld - TextField()
// とりあえず文字を書き出してみる。
//
package {
    import flash.display.*;
    import flash.text.*;
    public class Main extends Sprite {
        //------------------------------------------------------------
        // Mainコンストラクタ
        //
        public function Main() {

            //h1 TextFormat() を定義
            var tf_h1:TextFormat = new TextFormat();
            tf_h1.color = 0x666666;
            tf_h1.size = 30;
            tf_h1.font = 'Times New Roman';
            tf_h1.align = TextFieldAutoSize.CENTER;

            //titleを定義
            var title:TextField = new TextField();
            title.text = 'HelloWorld!! - TextField()';
            title.width = stage.stageWidth;
            title.height = 40;
            title.x = 0;
            title.y = (stage.stageHeight/2);
            title.setTextFormat( tf_h1 );
            title.background = true;
            title.backgroundColor = 0xEEEEEE;

            //stageに要素を追加
            stage.addChild( title );
        }
    }
}

▽結果

hellloWorld - TextField() - wonderfl build flash online

インスタンスのプロパティをwith文を使ってまとめてみる。

//titleを定義
var title:TextField = new TextField();
with( title ){
    text = 'HelloWorld!! - TextField()';
    width = stage.stageWidth;
    height = 40;
    x = 0;
    y = (stage.stageHeight/2);
    setTextFormat( tf_h1 );
    background = true;
    backgroundColor = 0xEEEEEE;
}

・・・これがですね、実は思わぬ落とし穴があって動いてくれないんです。

with文の中身というのは、親オブジェクトの名前領域の中にいる状態(表現あってる?)です。ここで問題になっているのは、stageオブジェクトです。"stage.stageWidth" の部分。 親が"title"オブジェクトなので、with文の中では、"title.stage.stageWidth" というように見られてしまいます。もちろん、titleインスタンスにはそんな階層のプロパティをもっていません。 それでもwith文を使いたい場合はこのように書きます。

//titleを定義
var title:TextField = new TextField();
var stageInstance:Object = stage;
with( title ){
    text = 'HelloWorld!! - TextField()';
    width = stageInstance.stageWidth;
    height = 40;
    x = 0;
    y = (stageInstance.stageHeight/2);
    setTextFormat( tf_h1 );
    background = true;
    backgroundColor = 0xEEEEEE;
}

一旦、上のスコープ内でstageを参照するオブジェクト"stageInstance" を生成して、"stageInstance" を参照しに行きます。この手間を考えると、そこまでしてwith文使う必要ないんじゃない?という気になります。名前領域に気を使うのはめんどくさ過ぎる気がします。

そんなwith文ちゃんでした。