【问题标题】:Creating objects dynamically, what's the alternative to eval?动态创建对象,eval的替代方法是什么?
【发布时间】:2011-11-26 21:25:39
【问题描述】:

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

【问题讨论】:

  • 解决方案在于获取数据的方式。你怎么把代码作为字符串提取?
  • 使用“what”作为输入的替代方法?
  • 你到底从什么开始?换句话说,字符串本身是从哪里来的?
  • 您可以直接使用创建对象的方式,而不是将其置于 eval 下,除非您不是从其他地方动态获取类名/函数名(如在 javascript 中)......
  • 这是一个练习使用对象和继承的练习。我创建了一个包含 9 个不同字符串的数组,然后我使用这个数组创建了 100 个对象,使用 Math.random() 为新对象提取字符串。

标签: javascript eval


【解决方案1】:

如果你可以用对象数组替换字符串数组,那么你可以试试这个:

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);
}

【讨论】:

    【解决方案2】:

    一种替代方法(虽然不一定是改进)是创建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 ]();
    

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

    【讨论】:

    • 我对 Javascript 的了解还很薄,字符串似乎是最简单的方法,我只是不知道任何其他方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2013-03-26
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多