Передать в конструктор параметры через массив
Есть такой вызов:
var obj = new MyObject(1a,a2); Мне нужно вызвать конструктор динамически и передать в него параметры через массив. Т.е. var args = [ a1, a2 ]; Для функции это можно сделать через apply(ptr,args) А как в данном случае это сделать? Что-то никак сообразить не могу. |
Задачу решил через eval().
Но вопрос остается открытым. |
Так не получится сделать. Eval лучше не использовать.
Лучше передавайте в конструктор объект: function MyObject(params) { alert(params.arg1); } var obj = new MyObject({arg1: a1, arg2: a2}); |
В том то и штука, что менять уже существующий конструктор нежелательно (так как это приведет к изменению большого по объему рабочего кода, который уже отлажен). Моё решение выглядит так:
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 тестил? |
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)); } |
Не совсем понимаю, как это работает.
Но как-то очень похоже на то же, что и у меня: формируется код для создания нужного класса. Только вот вызова eval не видно. Не раскажите основной принцип решения? Это какое-то переопределение оператора new? |
Цитата:
var object = $new(MyClass, arg1, arg2, arg3, ...); eval плох тем, что с ним, в общем случае, код нельзя обфусцировать, но всегда есть Function. Есть и другие варианты, без генерации кода http://shabunc.ya.ru/replies.xml?ite...255&ncrnd=4488 |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 22:42. |