2016-07-14 6 views
0

現時点では、eval()を使用してオブジェクトを動的に作成していますが、呼び出された関数コンストラクタは実際には終了しています。クロージャでオブジェクトを動的に作成する場合のeval()の代替ソリューション?

実際のアプリケーションコードのeval()の文字列は、条件に基づいて作成されています。

eval()を使用しないで同じ結果を得ることができるかどうかを知りたいと思います。

私はグローバルwindowIconLogoを追加して、新しいオブジェクトを宣言するときwindow[myDesiredFunction]のような構文を使用して回避ソリューションに興味があると思います。また、ハードコードされたスイッチケースステートメントは使用できません。

(function(window){ 
 
    var Icon = function(id){ 
 
     this.id = id; 
 
    }; 
 
    var Logo = function(id){ 
 
     this.id = id; 
 
    }; 
 
    var app = { 
 
     start:function(){ 
 
      var item1 = eval("new Icon('iconA')"); // i need replace eval() 
 
      var item2 = eval("new Logo('logoB')"); // just as example string will be created with some condition dynamically 
 
      console.log(item1 .id); 
 
      console.log(item2 .id); 
 
     } 
 
    }; 
 
    app.start(); 
 
})(window);

+1

をあなたはevalの – Mitul

+3

に変換するいくつかのデータをお願いできますだけでなく、オブジェクトウィッヒを作成し、これらの2つのコンストラクタを保存します(その後、 '新しいmyConstructorsのようにそれを呼び出します['Icon']( 'iconA') ') – Kaiido

+2

' var constructors = {アイコン:アイコン、ロゴ:ロゴ}; var item1 =新しいコンストラクタ["Icon"]( "iconA"); ' – nnnnnn

答えて

1

あなたはオブジェクトであなたのコンストラクタを格納する必要がある、とあなたは可変個の引数を使用したい場合は、ここでUse of .apply() with 'new' operator. Is this possible?記載された技術を使用する必要があります。

結果のコードは次のようになります。

(function(window) { 
    function Icon(id) { 
    this.id = id; 
    } 

    function Logo(id) { 
    this.id = id; 
    } 

    var constructors = { 
    Icon: Icon, 
    Logo: Logo 
    } 


    function createObject(name, arguments) { 
    var args = Array.prototype.slice.call(arguments); 
    args.unshift(null); 
    return new(Function.prototype.bind.apply(constructors[name], args)); 
    } 

    var app = { 
    start: function() { 
     var item1 = createObject('Icon', ['iconA']); 
     var item2 = createObject('Logo', ['logoB']); 
     console.dir(item1); 
     console.dir(item2); 
    } 
    }; 
    app.start(); 
})(window); 
関連する問題