From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../global_objects/reflect/construct/index.html | 151 +++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 files/ru/web/javascript/reference/global_objects/reflect/construct/index.html (limited to 'files/ru/web/javascript/reference/global_objects/reflect/construct') diff --git a/files/ru/web/javascript/reference/global_objects/reflect/construct/index.html b/files/ru/web/javascript/reference/global_objects/reflect/construct/index.html new file mode 100644 index 0000000000..e5eaa5af39 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/reflect/construct/index.html @@ -0,0 +1,151 @@ +--- +title: Reflect.construct() +slug: Web/JavaScript/Reference/Global_Objects/Reflect/construct +tags: + - ECMAScript6 + - Reflect +translation_of: Web/JavaScript/Reference/Global_Objects/Reflect/construct +--- +
{{JSRef}}
+ +

Статический метод Reflect.construct() работает как new operator. Он эквивалентен new target(...args). Это также дает дополнительную возможность указать другой прототип.

+ +
{{EmbedInteractiveExample("pages/js/reflect-construct.html")}}
+ + + +

Синтаксис

+ +
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
+
+ +

Спецификации

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{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")}}

+ +

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

+ + -- cgit v1.2.3-54-g00ecf