Когда я хочу вызвать функцию в javascript с аргументами, полученными из другого места, я могу использовать метод apply
функции, например:
array = ["arg1", 5, "arg3"]
...
someFunc.apply(null, array);
но что, если мне нужно вызвать конструктор аналогичным образом? Кажется, это не работает:
array = ["arg1", 5, "arg3"]
...
someConstructor.apply({}, array);
по крайней мере, не так, как я пытаюсь:
template = ['string1', string2, 'etc'];
var resultTpl = Ext.XTemplate.apply({}, template);
это не работает:
Ext.XTemplate.prototype.constructor.apply({}, template);
Есть ли способ заставить это работать? (В этом конкретном случае я обнаружил, что новый Ext.XTemplate (шаблон)
будет работать, но меня интересует общий случай)
аналогичный вопрос, но только для встроенных типов и без ответа. можешь использовать: Создание экземпляра объекта JavaScript путем вызова prototype.constructor.apply
Спасибо.
Прошло время, и ES6 и транспилеры теперь в ходу.
В ES6 легко сделать то, что я хотел: новый someConstructor (... array)
.
Babel превратит это в ES5 new (Function.prototype.bind.apply (someConstructor, [null] .concat (array))) ();
, что объясняется в Как создать объект JavaScript (используя «применить»)? .