Преобразование строки в объект JavaScript - есть ли более безопасный способ, чем использовать eval? - PullRequest
2 голосов
/ 14 февраля 2010

В идеале я хотел бы создать упрощенный интерфейс, который требует от пользователя выбрать одну из трех переключателей, как показано здесь:

<form id="icon-type">
    <input type="radio" name="icon" value="apples" /> Apples
    <input type="radio" name="icon" value="oranges" /> Oranges
    <input type="radio" name="icon" value="graphes" /> Grapes
</form>

Используя jQuery, легко определить, какой из трех был выбран:

var iconType = $('input[name=icon]:checked').val();

Однако мне нужно преобразовать строку, присвоенную iconType, в ранее созданный объект с тем же именем. Я читал, что eval() - лучший способ сделать это, но также встречал многочисленные предупреждения о том, что никогда не следует использовать eval(). Однако, кажется, нет другого способа выполнить это преобразование. Таким образом, мой вопрос: хотя я признаю, что eval(), безусловно, может быть использовано не по назначению, действительно ли это тот случай, когда eval() действительно подходящий подход?

Мысли очень ценятся!

РЕДАКТИРОВАТЬ: @DVK, спасибо! Все еще немного потерянный все же; предположим, мои объекты выглядят так:

var apple = new GIcon(baseIcon);
apple.image = "http://localhost/images/apple.png";

var orange = new GIcon(baseIcon);
orange.image = "http://localhost/images/orange.png";

Так что мне нужно преобразовать значение, полученное с выбранной радиокнопки, в соответствующую ссылку на объект. Как бы я хранил их в хеше, как вы объясните? Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 февраля 2010

Для таких простых строк, как эта, вы также можете просто сохранить соответствующие объекты в хеше и получить доступ к этому

var obj = object_map[iconType];

1 голос
/ 14 февраля 2010
var obj = window[iconType]

Вы также можете связать объект напрямую со входом.

$(function() {
    var form = $("#icon-type");
    form.get(0).iconTypeObject = new Apples();
    form.get(1).iconTypeObject = new Oranges();
    form.get(2).iconTypeObject = new Grapes();
});

var iconObject = $('input[name=icon]:checked')[0].iconTypeObject;
...