Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.08.2009, 23:06
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

Передать в конструктор параметры через массив
Есть такой вызов:
var obj = new MyObject(1a,a2);


Мне нужно вызвать конструктор динамически и передать в него параметры через массив.
Т.е.
var args = [
 a1,
 a2
];

Для функции это можно сделать через apply(ptr,args)
А как в данном случае это сделать? Что-то никак сообразить не могу.

Последний раз редактировалось Octane, 28.08.2009 в 23:17. Причина: используйте теги [html] и [js] для оформления кода
Ответить с цитированием
  #2 (permalink)  
Старый 28.08.2009, 23:20
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

Задачу решил через eval().
Но вопрос остается открытым.
Ответить с цитированием
  #3 (permalink)  
Старый 28.08.2009, 23:21
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Так не получится сделать. Eval лучше не использовать.

Лучше передавайте в конструктор объект:
function MyObject(params) {
    alert(params.arg1);
}

var obj = new MyObject({arg1: a1, arg2: a2});
Ответить с цитированием
  #4 (permalink)  
Старый 28.08.2009, 23:38
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

В том то и штука, что менять уже существующий конструктор нежелательно (так как это приведет к изменению большого по объему рабочего кода, который уже отлажен). Моё решение выглядит так:
var jsCode = "var res = new "+type+"(args[0]"; 
or(var i=1;i<args.length;i++)
jsCode += ",args["+i+"]";
eval(jsCode+");");
return res;

Это всё сделано в виде отдельной функции, в которую передаются параметры: type и args.
Работает вроде правильно.

P.S. Может есть какие-то ньюансы в каком-то браузере? А то я только в FF3.5 тестил?
Ответить с цитированием
  #5 (permalink)  
Старый 31.08.2009, 16:27
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

function $new(klass) {
    var argNames = [];
    for (var i = 1; i < arguments.length; i++)
        argNames.push('args[' + (i - 1) + ']');
    return new Function('klass, args', 'return new klass(' + argNames.join(',') + ');')(klass, [].slice.call(arguments, 1));
}
Ответить с цитированием
  #6 (permalink)  
Старый 01.09.2009, 09:34
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

Не совсем понимаю, как это работает.
Но как-то очень похоже на то же, что и у меня: формируется код для создания нужного класса. Только вот вызова eval не видно.
Не раскажите основной принцип решения? Это какое-то переопределение оператора new?
Ответить с цитированием
  #7 (permalink)  
Старый 01.09.2009, 10:04
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Shasoft
Не совсем понимаю, как это работает.
var object = $new(MyClass, arg1, arg2, arg3, ...);


eval плох тем, что с ним, в общем случае, код нельзя обфусцировать, но всегда есть Function.
Есть и другие варианты, без генерации кода http://shabunc.ya.ru/replies.xml?ite...255&ncrnd=4488

Последний раз редактировалось Kolyaj, 01.09.2009 в 10:08.
Ответить с цитированием
  #8 (permalink)  
Старый 01.09.2009, 11:29
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Kolyaj
eval плох тем, что с ним, в общем случае, код нельзя обфусцировать, но всегда есть Function.
Однако, eval работает с вызывающим контекстом (принципиально, если функция должна запомнить нужные локальные переменные), в то время как Function, в качестве [[Scope]] будет иметь только глобальный объект.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #9 (permalink)  
Старый 01.09.2009, 11:33
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Dmitry A. Soshnikov
Однако, eval работает с вызывающим контекстом
Нужные переменные из контекста мы можем передать в качестве параметров (что, собственно, и делается).
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста как передать массив в функцию serov Элементы интерфейса 3 21.08.2010 19:37
Как передать false через функцию? Tend Общие вопросы Javascript 7 16.03.2009 16:55
Как передать массив? remitmaster Общие вопросы Javascript 6 17.09.2008 12:47