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 September 2016.
Статический метод Reflect.construct()
работает как new
operator. Он эквивалентен new target(...args)
. Это также даёт дополнительную возможность указать другой прототип.
Интерактивный пример
Синтаксис
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); // false
console.log(obj2 instanceof OneClass); // false
console.log(obj1 instanceof OtherClass); // true
console.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; // true
d.getFullYear(); // 1776
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-reflect.construct |
Совместимость с браузерами
BCD tables only load in the browser