5

変数名をスローしてクラスをインスタンス化するにはどうすればよいですか? クラス内でこのメソッドを検討してください。

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

ビルドは多くのものを含むオブジェクトですが、最も重要なのは「効果」です。この効果は、独立したアニメーション クラスの名前です。1 つは「MarioKartMenu」と呼ばれます。

console.log(build.effect) は「MarioKartMenu」を出力します。しかしもちろん、次のようになります: TypeError: 式 'build.effect' の結果 [MarioKartMenu] はコンストラクターではありません。

ダイナミズムを捨てて、コードを次のようにすると:

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

それはうまく動作します。私がやろうとしているように動的にすることは可能ですか?

4

3 に答える 3

5

関数MarioKartMenuがグローバル スコープで定義されている場合は、次を使用して文字列名でアクセスできます。

window["MarioKartMenu"]

これは、すべてのグローバル変数がwindowオブジェクトのプロパティであるため機能します。

上記を考えると、次を使用して必要なものを実装できます。

var menuConstructor = window[build.effect];
var animationClass = new menuConstructor(el, build);
于 2009-05-28T22:51:40.720 に答える
2

build.effectコンストラクターを(その名前を含む文字列ではなく)に割り当てるだけで動作するはずです。

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

b = ...;
b.effect = MarioKartMenu;
animate(e, b);
于 2009-05-28T22:55:19.093 に答える
0

私が最初に考えたのは、JavaScript のeval()演算子を使用することですが、これは洗練されたソリューションではないことは理解しています。(このようなもの:これまでにこのようにvar animationClass = eval("new "+build.effect+"(el, build)");使用したことがないので、それが正しいかどうかはわかりませんeval()。)Ayman の答えは、このアイデアのはるかに優れたバリエーションです。

私の 2 番目の考えは、MarioKartMenu適切に抽象化されていないということです。そのため、エフェクト名を 3 番目のパラメーターとして取り、switch()ステートメントを使用して使用可能なすべてのエフェクトの中から選択し、正しいものをインスタンス化して返す単純なクラスを構築します。

于 2009-05-28T22:54:13.837 に答える