--- title: Reflect.construct() slug: Web/JavaScript/Reference/Global_Objects/Reflect/construct tags: - ECMAScript6 - Reflect translation_of: Web/JavaScript/Reference/Global_Objects/Reflect/construct ---
Статический метод Reflect
.construct()
работает как new
operator. Он эквивалентен new target(...args)
. Это также даёт дополнительную возможность указать другой прототип.
Reflect.construct(target, argumentsList[, newTarget])
target
argumentsList
target
должна вызываться.newTarget
{{optional_inline}}new.target
оператор. Если newTarget
не указан, то используется target
.Новый экземпляр target
(или newTarget
, если указан), инициализируется target
как конструктор с заданными аргументами.
Исключение {{jsxref("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
, объекты могли быть созданы с использованием произвольной комбинации из конструктора и прототипа при помощи {{jsxref("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()
и {{jsxref("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 |
---|---|---|
{{SpecName('ES2015', '#sec-reflect.construct', 'Reflect.construct')}} | {{Spec2('ES2015')}} | Initial definition. |
{{SpecName('ESDraft', '#sec-reflect.construct', 'Reflect.construct')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Reflect.construct")}}
new
new.target