Создание объектов динамически, какова альтернатива eval? - PullRequest
1 голос
/ 27 ноября 2011

Я пытаюсь создавать объекты динамически, используя eval(string). Мне не удалось найти альтернативу использованию eval или хотя бы что-то, что я мог бы понять.

Я перебираю код, который выглядит следующим образом, строка изменяется случайным образом, выбирается для массива строк, которые содержат определения объектов.

llista[dia] = eval('new Accident_mortal("EP-8", 17, "accident helicopter", 1, 2, 0)');

Из всего, что я прочитал, использование eval - это плохо, но я не могу понять, как еще я могу это сделать.

EDIT

Я думаю, что код Лоло мне нужен, могу ли я сделать следующее?

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] }  
}

До 9 объектов внутри var o, а затем использовать предложенный им код для генерации случайных объектов из этих 9 определений.

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Если вы можете заменить массив строк на массив объектов, то вы можете попробовать это:

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 голос
/ 27 ноября 2011

Альтернативой, хотя и не обязательно улучшением, было бы создание конструктора 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 ]();

В конечном счете, лучшим решением было бы не работать со строками, которые должны быть преобразованы в код.Если это неизбежно, ваши возможности ограничены.

...