Как воссоздать из строки(файла) с описанием объекта собственно объект с методами
Здравствуйте!
Есть следующая задача - на сервере имеется некий файл, в котором должен быть синтаксически корректный 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, если это имеет значение. |
Думаю, нужно просто использовать eval. А зачем все это?
|
Эвалить все как-то так:
$.get('module.js', function (data) { var obj = eval(data); }); Сам объект, чтобы eval не ругался, нужно обернуть в скобки: ({ method1: function() { // что-то делаем }, method2: function(var1, var2) { // ещё что-то делаем } }) |
А не проще динамически скачивать тот или иной файл как обычный скрипт, а не как текст? Потому что проще всего действительно eval в задаче которую вы описываете сейчас, но это плахое решение. И если это потребовалось - скорее всего есть архитектурная ошибка (хотя это не 100% случаев).
|
ixth, спасибо за подсказку. eval я, разумеется, пробовал, но окружить объект скобками как-то не догадался.
tsigel, я в курсе, что eval (равно как и new Function()) - плохое решение (и даже в курсе, почему :-)). Но я, к сожалению, не смог придумать другого решения поставленной задачи - чтобы описание объекта было в отдельном файле, чтобы имя этого файла вычислялось, и чтобы сгенерированный объект присваивался нужной переменной (если точнее - в свойство другого объекта, где имя этого свойства тоже вычисляется). Т.е. если записать это условно в коде, то чтобы получилось следующее: var objPropertyName = calcObjectPropertyName(); var objFileName = calcObjectFileName(); holderObject[objPropertyName] = loadObjectFromFile(objFileName);Видно, что при описании объекта неизвестно, в поле с каким именем надо будет положить созданный объект. Да и вообще, если описание объекта будет знать, как оно будет использоваться - это совершенно ненужная и при этом довольно сильная зависимость. Если подскажете, как эту логику можно реализовать без eval - буду очень благодарен. |
Дык, а зачем? Правда неясно. )
|
Почитайте в сторону requirejs - должно помочь
|
Часовой пояс GMT +3, время: 03:18. |