Reflect.construct()
Статический метод 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