如何初始化一个名称基于变量的对象

时间:2013-11-21 17:30:00

标签: javascript jquery oop

我有一堆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);

3 个答案:

答案 0 :(得分:1)

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

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

正如MDN reference所说:

  

不要使用eval!

     

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

答案 1 :(得分:1)

如果这些类属于全局范围,请尝试以下方法:

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 */};
...

答案 2 :(得分:0)

使用映射类型的字典:

var objmap = {
 'texteditor': TextEditor,
 ...
 };

var tmpObj = new objmap[objtype](...)