Reflect.construct()
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Статический методReflect.construct()
работает какnew
operator. Он эквивалентенnew target(...args)
. Это также даёт дополнительную возможность указать другой прототип.
Интерактивный пример
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 |