动态创建对象,eval的替代方法是什么?

时间:2011-11-26 21:25:39

标签: javascript eval

我正在尝试使用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个定义中生成随机对象。

2 个答案:

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

最终,最好的解决方案是不必使用需要在代码中进行评估的字符串。如果这是不可避免的,那么您的选择是有限的。