
28.08.2009, 23:06
|
 |
Профессор
|
|
Регистрация: 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] для оформления кода
|
|

28.08.2009, 23:20
|
 |
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
|
Задачу решил через eval().
Но вопрос остается открытым.
|
|

28.08.2009, 23:21
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Так не получится сделать. Eval лучше не использовать.
Лучше передавайте в конструктор объект:
function MyObject(params) {
alert(params.arg1);
}
var obj = new MyObject({arg1: a1, arg2: a2});
|
|

28.08.2009, 23:38
|
 |
Профессор
|
|
Регистрация: 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 тестил?
|
|

31.08.2009, 16:27
|
|
Новичок на форуме
|
|
Регистрация: 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));
}
|
|

01.09.2009, 09:34
|
 |
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
|
Не совсем понимаю, как это работает.
Но как-то очень похоже на то же, что и у меня: формируется код для создания нужного класса. Только вот вызова eval не видно.
Не раскажите основной принцип решения? Это какое-то переопределение оператора new?
|
|

01.09.2009, 10:04
|
|
Новичок на форуме
|
|
Регистрация: 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.
|
|

01.09.2009, 11:29
|
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
|
Сообщение от Kolyaj
|
|
eval плох тем, что с ним, в общем случае, код нельзя обфусцировать, но всегда есть Function.
|
Однако, eval работает с вызывающим контекстом (принципиально, если функция должна запомнить нужные локальные переменные), в то время как Function, в качестве [[Scope]] будет иметь только глобальный объект.
|
|

01.09.2009, 11:33
|
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
|
Сообщение от Dmitry A. Soshnikov
|
|
Однако, eval работает с вызывающим контекстом
|
Нужные переменные из контекста мы можем передать в качестве параметров (что, собственно, и делается).
|
|
|
|