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 Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Reflect.construct' в этой спецификации.
Стандарт Initial definition.
ECMAScript Latest Draft (ECMA-262)
Определение 'Reflect.construct' в этой спецификации.
Черновик  

Совместимость с браузерами

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
constructChrome Полная поддержка 49Edge Полная поддержка 12Firefox Полная поддержка 42IE Нет поддержки НетOpera Полная поддержка 36Safari Полная поддержка 10WebView Android Полная поддержка 49Chrome Android Полная поддержка 49Firefox Android Полная поддержка 42Opera Android Полная поддержка 36Safari iOS Полная поддержка 10Samsung Internet Android Полная поддержка 5.0nodejs Полная поддержка 6.0.0

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

Смотрите также