在闭包中动态创建对象时,eval()的替代解决方案?

时间:2016-07-14 08:43:54

标签: javascript

目前我使用eval()动态创建对象,调用的函数构造函数实际上处于闭包状态。

我的真实应用代码中eval()中的字符串是根据条件创建的。

我想知道是否有可能实现相同的结果,避免使用eval()

我会对避免将IconLogo添加到window全局,并在声明新对象时使用window[myDesiredFunction]等语法的解决方案感兴趣。此外,我不能使用任何硬编码的switch case语句。



(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 个答案:

答案 0 :(得分: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);