我有一堆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);
答案 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](...)