2009-05-28 8 views
5

変数名を投げてクラスをインスタンス化するにはどうすればよいですか?変数を使ってクラスを動的にインスタンス化する

animate: function(el, build) { 
     console.log(build.effect); 
     var animationClass = new build.effect(el,build); 
}, 

ビルドは、原料の多くを含むオブジェクトであるが、最も重要なの 「効果」: クラス内でこのメソッドを考えてみましょう。このエフェクトは、独立したアニメーションクラスの名前です。 "MarioKartMenu"と呼ばれます。

console.log(build.effect)は "MarioKartMenu"を表示します。 もちろんです:TypeError:式 'build.effect'の結果[MarioKartMenu]はコンストラクタではありません。

私はダイナミズムをゴミ箱だけのようなコードを作成する場合:

animate: function(el, build) { 
     var animationClass = new MarioKartMenu(el,build); 
    }, 

それだけで正常に動作します。それは私がしようとしているように動的にすることは可能ですか?機能MarioKartMenuは、グローバルスコープで定義されている場合

答えて

5

、あなたが使用して、その文字列名でアクセスすることができます

window["MarioKartMenu"] 

すべてのグローバル変数は、windowオブジェクトのプロパティであるので、これは動作します。上記の

、あなたが使用することによって、あなたが欲しいものを実装することができます:

var menuConstructor = window[build.effect]; 
var animationClass = new menuConstructor(el, build); 
+0

パーフェクト、私はそれを感じても、そのようになりました。ありがとうございました。 –

+0

jsクラスの中にあれば** 'this [" MarioKartMenu "]' **として使うことができます。私はこれをしばらく打ち、それを理解した!! – IJas

0

私の最初の考えは、私は、これはエレガント未満ソリューションであることを理解ものの、JavaScriptののeval()演算子を使用することです。 (このようなSoemthing:var animationClass = eval("new "+build.effect+"(el, build)");私は正しいことがわからないが、前にこのようなeval()を使用していないので。アイマンの答えは、このアイデアのはるかに良いバリエーションです。

私の考えはMarioKartMenuが適切に抽象化されていないということです。だから、私は3番目のパラメータとしてエフェクト名をとり、switch()ステートメントを使ってすべての利用可能なエフェクトを選択し、正しいエフェクトをインスタンス化して返すシンプルなクラスを作成します。

+0

良い提案。アニメーションクラスを呼び出すクラスは、誰もが独自のアニメーションを作成して使用できるように完全に拡張できるため、最終的にそこにどのような効果があるかわかりません。そのため、switch文は動作しません。 –

2

ちょうどbuild.effectにコンストラクタ(ないその名を含む文字列)を割り当て、それが動作するはずです:

animate = function(el, build) { 
    var animationClass = new build.effect(el,build); 
} 
// ... 

b = ...; 
b.effect = MarioKartMenu; 
animate(e, b); 
+0

もう一度知っておいて欲しいですが、もう一度他の人がアニメーションクラスに名前を付けるかどうかわからないので、まだ文字列を扱っています。おそらく私はあなたが言っていることを誤解しています。 –

+1

クラスのユーザーは、使用するエフェクトを指定する必要があります。そこにはコンストラクタ関数の名前を含む文字列の代わりにコンストラクタ関数自体を渡すことはできませんか? インターフェイスがどのように見えるかわかりませんが、ユーザーが次のようなことをするように見えます:var FooMenu = {...}; setEffect( "FooMenu");.私は文字列を使用せず、FooMenuを直接渡すことをお勧めします:var FooMenu = {...}; setEffect(FooMenu);. – sth

+0

非常に有効です。私はこれを調べるつもりです。 –

関連する問題