目前我使用eval()
动态创建对象,调用的函数构造函数实际上处于闭包状态。
我的真实应用代码中eval()
中的字符串是根据条件创建的。
我想知道是否有可能实现相同的结果,避免使用eval()
。
我会对避免将Icon
和Logo
添加到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);

答案 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);