Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2014, 14:50
Новичок на форуме
Отправить личное сообщение для Eugenius Посмотреть профиль Найти все сообщения от Eugenius
 
Регистрация: 11.08.2014
Сообщений: 2

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

Есть следующая задача - на сервере имеется некий файл, в котором должен быть синтаксически корректный 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, если это имеет значение.
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2014, 23:08
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Думаю, нужно просто использовать eval. А зачем все это?
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2014, 23:13
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

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

Сам объект, чтобы eval не ругался, нужно обернуть в скобки:
({
    method1: function() {
        // что-то делаем
    },
    method2: function(var1, var2) {
        // ещё что-то делаем
    }
})
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2014, 23:15
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

А не проще динамически скачивать тот или иной файл как обычный скрипт, а не как текст? Потому что проще всего действительно eval в задаче которую вы описываете сейчас, но это плахое решение. И если это потребовалось - скорее всего есть архитектурная ошибка (хотя это не 100% случаев).
Ответить с цитированием
  #5 (permalink)  
Старый 12.08.2014, 08:01
Новичок на форуме
Отправить личное сообщение для Eugenius Посмотреть профиль Найти все сообщения от Eugenius
 
Регистрация: 11.08.2014
Сообщений: 2

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

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

Если подскажете, как эту логику можно реализовать без eval - буду очень благодарен.
Ответить с цитированием
  #6 (permalink)  
Старый 12.08.2014, 09:31
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Дык, а зачем? Правда неясно. )
Ответить с цитированием
  #7 (permalink)  
Старый 12.08.2014, 09:57
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как по событию вызвать метод определенного экземпляра объекта jvs jQuery 3 24.12.2009 16:04
Подскажите как узнать существует ли объект в памяти? Yazla Общие вопросы Javascript 2 05.11.2009 20:05
как найти нужный объект? `p r o x y jQuery 2 05.05.2009 01:12
как узнать тип значения объекта? VHS Общие вопросы Javascript 1 07.01.2009 23:57