HTML: Markup language
CSS: Styling language
JavaScript: Scripting language
Web APIs: Programming interfaces
All web technology
Learn web development
Discover our tools
Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
View in English Always switch to English
This feature is well established and works across many devices and browser versions. It’s been available across browsers since сентябрь 2016 г..
Статический метод Reflect.construct() работает как new operator. Он эквивалентен new target(...args). Это также даёт дополнительную возможность указать другой прототип.
Reflect.construct()
new
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: 6 console.log(object1.sum); // Expected output: 6
Reflect.construct(target, argumentsList[, newTarget])
target
Целевая функция для вызова.
argumentsList
Массивоподобный объект указывающий аргументы, с которыми target должна вызываться.
newTarget
Конструктор, чей прототип должен быть использован. Смотрите также new.target оператор. Если newTarget не указан, то используется target.
new.target
Новый экземпляр target (или newTarget, если указан), инициализируется target как конструктор с заданными аргументами.
Исключение TypeError, если target или newTarget не являются конструкторами.
TypeError
Reflect.construct() позволяет вам вызывать конструктор с любым числом аргументов (что также возможно с использованием spread syntax вместе с new operator).
var obj = new Foo(...args); var obj = Reflect.construct(Foo, args);
Object.create()
До появления Reflect, объекты могли быть созданы с использованием произвольной комбинации из конструктора и прототипа при помощи Object.create().
Reflect
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 не будет использовано для создания объекта.
Function.prototype.apply()
undefined
С другой стороны, в случае вызова 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
var d = Reflect.construct(Date, [1776, 6, 4]); d instanceof Date; // true d.getFullYear(); // 1776
Enable JavaScript to view this browser compatibility table.