By | 2008年9月29日

以前からできないのかなと思っていて、
ちょっと調べたらできそうだったので調べてみた。

試した環境は Flex3 SDK です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getDefinitionByName;
 
    public class Hoge extends Sprite {
        public function Hoge() {
       var cls:Class = getDefinitionByName("flash.text.TextField") as Class;
            var t:TextField = new cls();
            t.text = "hoge";
            t.y = 100;
            addChild(t);
 
            var t2:TextField = new TextField();
            t2.text = "fuga";
            addChild(t2);
        }
    }
}

特に重要なのが8-9行目ですね。
これで動的にインスタンスを生成することができるみたいです。

getDefinitionByName便利ですね。
でもよく考えればできそうな気もせんでもないような。。。。
ま、できてなによりです。

参考資料
http://blog.isocchi.com/2007/12/flex-actionscript.html
http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=1241

——————————————————————————————–
追記: 2008/9/30 22:52

パフォーマンスがちょっと気になったのでベンチをとってみた。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package {
 
    import flash.display.Sprite;
    import flash.utils.getTimer;
    import flash.utils.getDefinitionByName;
    import org.libspark.utils.Dumper;
 
    public class Generate extends Sprite{
 
        private static const ROUND:uint = 50000;
 
        public function Generate(){
            bench(generate_new, "new");
            bench(generate_class, "[new - class]");
        }
 
 
        private function generate_new():void{
            for (var i:int = 0; i < ROUND; i++){ new Sprite(); }
        }
 
        private function generate_class():void{
            for (var i:int = 0; i < ROUND; i++){
                var cls:Class = getDefinitionByName("flash.display.Sprite") as Class;
                new cls();
            }
        }
 
        private function bench(func:Function, tag:String):void{
            var start:uint = getTimer();
            func();
            trace((getTimer() - start) + "ms :" + tag);
        }
    }
}
[64bitの結果]
330ms :new
659ms :[new - class]
355ms :new
658ms :[new - class]
 
[32bitの結果]
1285ms :new
1172ms :[new - class]
1285ms :new
1211ms :[new - class]

会社でも試した結果、おそらく32bitだと[new – class]の方がはやかった。
なぜだーーーーーと思って、家の64bit環境で試したら上記のような結果。
まぁ。。。納得?

できねーしw