This page was translated from English by the community.Learn more and join the MDN Web Docs community.
Reflect.construct()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since сентябрь 2016 г..
Статический методReflect.construct() работает какnew operator. Он эквивалентенnew target(...args). Это также даёт дополнительную возможность указать другой прототип.
In this article
Интерактивный пример
function func1(a, b, c) { this.sum = a + b + c;}const args = [1, 2, 3];const object1 = new func1(...args);const object2 = Reflect.construct(func1, args);console.log(object2.sum);// Expected output: 6console.log(object1.sum);// Expected output: 6Синтаксис
Reflect.construct(target, argumentsList[, newTarget])
Параметры
targetЦелевая функция для вызова.
argumentsListМассивоподобный объект указывающий аргументы, с которыми
targetдолжна вызываться.newTargetНеобязательныйКонструктор, чей прототип должен быть использован. Смотрите также
new.targetоператор. ЕслиnewTargetне указан, то используетсяtarget.
Возвращаемое значение
Новый экземплярtarget (илиnewTarget, если указан), инициализируетсяtarget как конструктор с заданными аргументами.
Исключения
ИсключениеTypeError, еслиtarget илиnewTarget не являются конструкторами.
Описание
Reflect.construct() позволяет вам вызывать конструктор с любым числом аргументов (что также возможно с использованиемspread syntax вместе сnew operator).
var obj = new Foo(...args);var obj = Reflect.construct(Foo, args);Reflect.construct() противObject.create()
До появленияReflect, объекты могли быть созданы с использованием произвольной комбинации из конструктора и прототипа при помощиObject.create().
function OneClass() { this.name = "one";}function OtherClass() { this.name = "other";}// Данный вызов:var obj1 = Reflect.construct(OneClass, args, OtherClass);// ...будет аналогичен данному:var obj2 = Object.create(OtherClass.prototype);OneClass.apply(obj2, args);console.log(obj1.name); // 'one'console.log(obj2.name); // 'one'console.log(obj1 instanceof OneClass); // falseconsole.log(obj2 instanceof OneClass); // falseconsole.log(obj1 instanceof OtherClass); // trueconsole.log(obj2 instanceof OtherClass); // trueВ любом случае, пока конечный результат один и тот же, существует одно важное отличие в этом процессе. При использованииObject.create() иFunction.prototype.apply(), операторnew.target будет указывать наundefined внутри функции используемой в качестве конструктора, пока ключевое словоnew не будет использовано для создания объекта.
С другой стороны, в случае вызоваReflect.construct(), операторnew.target будет указывать на параметрnewTarget если он задан, илиtarget в отличном случае.
function OneClass() { console.log("OneClass"); console.log(new.target);}function OtherClass() { console.log("OtherClass"); console.log(new.target);}var obj1 = Reflect.construct(OneClass, args);// Вывод:// OneClass// function OneClass { ... }var obj2 = Reflect.construct(OneClass, args, OtherClass);// Вывод:// OneClass// function OtherClass { ... }var obj3 = Object.create(OtherClass.prototype);OneClass.apply(obj3, args);// Вывод:// OneClass// undefinedПримеры
>ИспользованияReflect.construct()
var d = Reflect.construct(Date, [1776, 6, 4]);d instanceof Date; // trued.getFullYear(); // 1776Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-reflect.construct> |