Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как воссоздать из строки(файла) с описанием объекта собственно объект с методами (https://javascript.ru/forum/misc/49394-kak-vossozdat-iz-stroki-fajjla-s-opisaniem-obekta-sobstvenno-obekt-s-metodami.html)

Eugenius 11.08.2014 14:50

Как воссоздать из строки(файла) с описанием объекта собственно объект с методами
 
Здравствуйте!

Есть следующая задача - на сервере имеется некий файл, в котором должен быть синтаксически корректный js-код, описывающий некий объект с методами. Название файла не задано заранее, а вычисляется. Мы берём этот содержимое этого файла в виде строки и должны воссоздать из этой строки объект с методами, в точности такой, как описано в файле. Описание объекта (содержимое файла) выглядит примерно так:
{
    method1: function() {
        // что-то делаем
    },
    method2: function(var1, var2) {
        // ещё что-то делаем
    }
}


Файл будет редактироваться в умной IDE, поэтому, как я уже сказал, код должен быть синтаксически корректен. Допустимо сделать в файле вокруг описываемого объекта некое минимальное оформление - точнее, насколько я понимаю, это даже необходимо, потому что на код без обвязки (такой, как приведён выше) IDE вполне логично ругается.

Пока что я пришёл к следующему:
файл выглядит так:
var a = {
    method1: function() {
        // что-то делаем
    },
    method2: function(var1, var2) {
        // ещё что-то делаем
    };
}

return a;

место создания объекта выглядит так:
var newObject = new Function(data).call();

где data - это строка с содержимым файла.

Понятно, что это решение далеко от идеала - обвязка вокруг описания объекта выглядит не очень красиво, да и IDE ругается на return вне функции, но мне в голову больше ничего не приходит, поэтому запрашиваю помощь зала. Может, у кого-нибудь есть идеи?

PS. Если не использовать переменную, а сразу сделать return, то код выглядит чуть красивее, но IDE подчёркивает его весь красным, что очень неудобно.

PPS. Из фреймворков используется jQuery, если это имеет значение.

ixth 11.08.2014 23:08

Думаю, нужно просто использовать eval. А зачем все это?

ixth 11.08.2014 23:13

Эвалить все как-то так:
$.get('module.js', function (data) {
    var obj = eval(data);
});

Сам объект, чтобы eval не ругался, нужно обернуть в скобки:
({
    method1: function() {
        // что-то делаем
    },
    method2: function(var1, var2) {
        // ещё что-то делаем
    }
})

tsigel 11.08.2014 23:15

А не проще динамически скачивать тот или иной файл как обычный скрипт, а не как текст? Потому что проще всего действительно eval в задаче которую вы описываете сейчас, но это плахое решение. И если это потребовалось - скорее всего есть архитектурная ошибка (хотя это не 100% случаев).

Eugenius 12.08.2014 08:01

ixth, спасибо за подсказку. eval я, разумеется, пробовал, но окружить объект скобками как-то не догадался.

tsigel, я в курсе, что eval (равно как и new Function()) - плохое решение (и даже в курсе, почему :-)). Но я, к сожалению, не смог придумать другого решения поставленной задачи - чтобы описание объекта было в отдельном файле, чтобы имя этого файла вычислялось, и чтобы сгенерированный объект присваивался нужной переменной (если точнее - в свойство другого объекта, где имя этого свойства тоже вычисляется). Т.е. если записать это условно в коде, то чтобы получилось следующее:
var objPropertyName = calcObjectPropertyName();
var objFileName = calcObjectFileName();
holderObject[objPropertyName] = loadObjectFromFile(objFileName);
Видно, что при описании объекта неизвестно, в поле с каким именем надо будет положить созданный объект. Да и вообще, если описание объекта будет знать, как оно будет использоваться - это совершенно ненужная и при этом довольно сильная зависимость.

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

ixth 12.08.2014 09:31

Дык, а зачем? Правда неясно. )

tsigel 12.08.2014 09:57

Почитайте в сторону requirejs - должно помочь


Часовой пояс GMT +3, время: 03:18.