Когда я хочу вызвать функцию в 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);
это не работает wither:
Ext.XTemplate.prototype.constructor.apply({}, template);
Любой способ заставить эту работу работать? (В этом конкретном случае я обнаружил, что new Ext.XTemplate(template)
будет работать, но меня интересует общий случай)
похожий вопрос, но специфичный для встроенных типов и без ответа, который я могу использовать: Создание объекта JavaScript с помощью вызова prototype.constructor.apply
Спасибо.
Изменить:
Время прошло, и ES6 и транспилеры теперь вещь.
В ES6 тривиально делать то, что я хотел: new someConstructor(...array)
.
Babel превратит это в ES5 new (Function.prototype.bind.apply(someConstructor, [null].concat(array)))();
, который объясняется в Как построить объект JavaScript (используя "apply" )?.