【问题标题】:how to initialize an object which name is based on a variable如何初始化名称基于变量的对象
【发布时间】:2013-11-21 17:30:00
【问题描述】:

我有一堆 ob 对象,我需要根据用户输入来初始化它们,我所有的对象都基于同一个父对象并且它们以相同的方式初始化。所以现在我有类似的东西:

if (response['type'] === 'texteditor') {
    tmpObj = new Texteditor(response['theID'], response['type'], response['devicesView'], templateID);
    responseMarkup[0].addEventListener("dblclick", tmpObj);
} else if (response['type'] === 'rectangle') {
    tmpObj = new Rectangule(response['theID'], response['type'], response['devicesView'], templateID);
} else if (response['type'] === 'image') {
    tmpObj = new MyImage(response['theID'], response['type'], response['devicesView'], templateID);
} else {
    tmpObj = new Elements(response['theID'], response['type'], response['devicesView'], templateID);
}

所以因为我将编写更多对象,所以我想做这样的事情:

tmpObj = new $[response['type']](response['theID'], response['type'], response['devicesView'], templateID);

【问题讨论】:

    标签: javascript jquery oop


    【解决方案1】:

    您可以使用 Eval 来执行此操作:

    var objType = "Rectangule";
    eval("tmpObj = new "+objType +"(response['theID'], response['type'], response['devicesView'], templateID);");
    

    正如MDN reference 所说:

    不要使用 eval!

    eval() 是一个危险函数,它执行它传递的代码 具有调用者的特权。如果您使用字符串运行 eval() 可能会受到恶意方的影响,您最终可能会运行 具有您的权限的用户计算机上的恶意代码 网页/扩展。更重要的是,第三方代码可以看到 调用 eval() 的范围,这可能导致可能的攻击 以类似功能不易受影响的方式。

    【讨论】:

      【解决方案2】:

      如果这些类在全局范围内,请尝试以下操作:

      var constructor = window[response['type']];
      if( constructor ) {
          tmpObj = new constructor(response['theID'], response['type'], response['devices'], templateID);
      }
      

      如果不是,我想你将不得不选择邪恶的eval,或者为了更安全,只需将这些类嵌套在你可以访问的对象中,比如

      var classes = {};
      
      classes.Texteditor = function(){/* your code */};
      classes.Rectangle  = function(){/* your code */};
      ...
      

      【讨论】:

      • 它给了我这个错误:“Uncaught TypeError: object is not a function”
      【解决方案3】:

      使用字典映射类型:

      var objmap = {
       'texteditor': TextEditor,
       ...
       };
      
      var tmpObj = new objmap[objtype](...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 2014-12-23
        • 2013-05-15
        • 2013-07-04
        • 2019-08-28
        • 2015-04-16
        • 1970-01-01
        相关资源
        最近更新 更多