Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передать в конструктор параметры через массив (https://javascript.ru/forum/misc/4907-peredat-v-konstruktor-parametry-cherez-massiv.html)

Shasoft 28.08.2009 23:06

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


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

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

Shasoft 28.08.2009 23:20

Задачу решил через eval().
Но вопрос остается открытым.

Octane 28.08.2009 23:21

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

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

var obj = new MyObject({arg1: a1, arg2: a2});

Shasoft 28.08.2009 23:38

В том то и штука, что менять уже существующий конструктор нежелательно (так как это приведет к изменению большого по объему рабочего кода, который уже отлажен). Моё решение выглядит так:
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 тестил?

Kolyaj 31.08.2009 16:27

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));
}

Shasoft 01.09.2009 09:34

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

Kolyaj 01.09.2009 10:04

Цитата:

Сообщение от Shasoft
Не совсем понимаю, как это работает.

var object = $new(MyClass, arg1, arg2, arg3, ...);


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

Dmitry A. Soshnikov 01.09.2009 11:29

Цитата:

Сообщение от Kolyaj
eval плох тем, что с ним, в общем случае, код нельзя обфусцировать, но всегда есть Function.

Однако, eval работает с вызывающим контекстом (принципиально, если функция должна запомнить нужные локальные переменные), в то время как Function, в качестве [[Scope]] будет иметь только глобальный объект.

Kolyaj 01.09.2009 11:33

Цитата:

Сообщение от Dmitry A. Soshnikov
Однако, eval работает с вызывающим контекстом

Нужные переменные из контекста мы можем передать в качестве параметров (что, собственно, и делается).


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