我正在尝试使用eval(string)
动态创建对象。我一直无法找到使用eval
或至少我能理解的东西的替代方案。
我循环遍历如下所示的代码,字符串随机变化,拾取包含对象定义的字符串数组。
llista[dia] = eval('new Accident_mortal("EP-8", 17, "accident helicopter", 1, 2, 0)');
从我周围读到的内容来看,使用eval
是一件坏事,但我无法弄清楚我还能做到这一点。
修改
我认为Lolo的代码是我需要的,我能做到以下几点吗?
var o = [
{ clazz1: 'Accident_mortal', args: ["EP-8", 17, "accident helicopter", 1, 2, 0] },
{ clazz2: 'Accident_mortal', args: ["B45", 101, "accident camio", 4, 3, 1] },
{ clazz3: 'Accident_mortal', args: ["C19", 234, "accident tot terreny", 2, 1, 1] }
}
var o中最多9个对象,然后使用他建议的代码从这9个定义中生成随机对象。
答案 0 :(得分:2)
如果你可以用对象数组替换字符串数组,那么你可以试试这个:
function construct(constructor, args) {
function F() {
return constructor.apply(this, args);
}
F.prototype = constructor.prototype;
return new F();
}
// objects definitions
var o = [
{ clazz: 'Accident_mortal', args: ["EP-8", 17, "accident helicopter", 1, 2, 0] }
]
// create objects
for (var i = 0; i < o.length; ++i) {
var x = construct(window[o[i].clazz], o[i].args);
}
答案 1 :(得分:1)
另一种方法(尽管不一定是改进)是创建Function
构造函数来评估字符串,然后返回新对象。
// |---create a new Function
llista[dia] = (new Function( 'return ' + my_string_array[0] ))();
// invoke the new Function-------------------|
但如果您需要多次eval
这些字符串中的任何一个,这可能是合乎需要的。
您可以使用新函数覆盖数组的每个成员。
for( var i = 0; i < my_string_array; ++i ) {
my_string_array[ i ] = new Function( 'return ' + my_string_array[ i ] );
}
现在,您可以引用数组中的每个项目作为一个函数,该函数返回使用给定参数从构造函数创建的对象。
// create two objects given the same arguments
var obj_1 = my_string_array[ 2 ]();
var obj_2 = my_string_array[ 2 ]();
最终,最好的解决方案是不必使用需要在代码中进行评估的字符串。如果这是不可避免的,那么您的选择是有限的。