При вызове конструктора с помощью new невозможно напрямую использовать массив и применить (apply выполняет [[Call]], а не [[Construct]]). Однако массив может быть легко использован с новым благодаря расширенному синтаксису.
var dateFields = [1970, 0, 1]; // 1 Jan 1970
var d = new Date(...dateFields);
Итак, почему мы не можем использовать заявку для конструктора? Есть ли разница между вызовом и конструкцией?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


[[Call]] вызывается через Date(…), тогда как [[Construct]] вызывается через new Date(…). Если вы попытаетесь [[Construct]] Date через new Date.apply(…, dateFields), он фактически вызовет [[Construct]] в методе Function.prototype.apply, а не в объекте Date, который не инициализирует должным образом объект Date, а скорее попытается инициализировать объект apply.prototype. объект с [[Prototype]], равным undefined, который является apply(), поскольку TypeError не является конструируемой функцией и поэтому выдает Date.
Чтобы уточнить, я не говорю, что невозможно применить массив аргументов к конструктору apply в ES5, я просто объясняю, почему использование Date для [[Construct]] Date(…) не работает.
Функция-конструктор обращается к сконструированному объекту с помощью this, который вы можете легко смоделировать с помощью первого аргумента apply, поэтому [[Construct]] по сути является просто [[Call]] с другим контекстом:
var obj = Object.create(Date.prototype);
Date.apply(obj, dateFields);
Если вам нужна версия ES6, есть совершенно новый метод прямого вызова [[construct]]:
var obj = Reflect.construct(Date, dateFields);