ちょっとFlashではまったので、メモしておくよ。 文字列からクラスインスタンスをダイナミックに生成する際 Function.applyを使いたいと思ったんだけど うまく行かなかったので、いろいろ試してみた。
わかりやすいように、「String」クラスの例だが 実際には[mypackage.MyClass]などでやるのが普通だろう。
そういう場合は、最初に mypackage.MyClass; として、クラスを利用する事を宣言しとかないと、コンパイル時に無視されるので注意。
var classFunc:Function = eval(className);
var test:String;
// OK
test = new classFunc("a");
trace(test.length); // a
// NG
test = new classFunc.call(null,"a");
trace(test.length); // undefined
// NG
test = new classFunc.apply(null,["a"]);
trace(test.length); // undefined
var returnClass:Function = function( classFunc:Function, args:Array ){
return classFunc.apply(null,args);
}
// OK
test = new classFunc( returnClass(classFunc,["a"]) );
trace(test.length); // 1
どういう事かというと String.apply(null,args); をリターンする新しい関数をかましてやると、 new しながらFunction.applyも使えるよねって事だ。
