diff options
| author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
|---|---|---|
| committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
| commit | 074785cea106179cb3305637055ab0a009ca74f2 (patch) | |
| tree | e6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/reference/global_objects/reflect/construct | |
| parent | da78a9e329e272dedb2400b79a3bdeebff387d47 (diff) | |
| download | translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2 translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip | |
initial commit
Diffstat (limited to 'files/ru/web/javascript/reference/global_objects/reflect/construct')
| -rw-r--r-- | files/ru/web/javascript/reference/global_objects/reflect/construct/index.html | 151 |
1 files changed, 151 insertions, 0 deletions
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 +--- +<div>{{JSRef}}</div> + +<p>Статический метод <code><strong>Reflect</strong></code><strong><code>.construct()</code></strong> работает как <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new"><code>new</code> operator</a>. Он эквивалентен <code>new target(...args)</code>. Это также дает дополнительную возможность указать другой прототип.</p> + +<div>{{EmbedInteractiveExample("pages/js/reflect-construct.html")}}</div> + + + +<h2 id="Синтаксис">Синтаксис</h2> + +<pre class="syntaxbox">Reflect.construct(target, argumentsList[, newTarget]) +</pre> + +<h3 id="Параметры">Параметры</h3> + +<dl> + <dt><code>target</code></dt> + <dd>Целевая функция для вызова.</dd> + <dt><code>argumentsList</code></dt> + <dd>Массивоподобный объект указывающий аргументы, с которыми <code>target</code> должна вызываться.</dd> + <dt><code>newTarget</code> {{optional_inline}}</dt> + <dd>Конструктор, чей прототип должен быть использован. Смотрите также <a href="/en-US/docs/Web/JavaScript/Reference/Operators/new.target"><code>new.target</code></a> оператор. Если <code>newTarget</code> не указан, то используется <code>target</code>.</dd> +</dl> + +<h3 id="Возвращаемое_значение">Возвращаемое значение</h3> + +<p>Новый экземпляр <code>target</code> (или <code>newTarget</code>, если указан), инициализируется <code>target</code> как конструктор с заданными аргументами.</p> + +<h3 id="Исключения">Исключения</h3> + +<p>Исключение {{jsxref("TypeError")}}, если <code>target</code> или <code>newTarget</code> не являются конструкторами.</p> + +<h2 id="Описание">Описание</h2> + +<p><code>Reflect.construct()</code> позволяет вам вызывать конструктор с любым числом аргументов (что также возможно с использованием <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax">spread syntax</a> вместе с <a href="/en-US/docs/Web/JavaScript/Reference/Operators/new"><code>new</code> operator</a>).</p> + +<pre class="brush: js">var obj = new Foo(...args); +var obj = Reflect.construct(Foo, args); +</pre> + +<h3 id="Reflect.construct()_против_Object.create()"><code>Reflect.construct()</code> против <code>Object.create()</code></h3> + +<p>До появления <code>Reflect</code>, объекты могли быть созданы с использованием произвольной комбинации из конструктора и прототипа при помощи {{jsxref("Object.create()")}}.</p> + +<pre class="brush: js">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 +</pre> + +<p>В любом случае, пока конечный результат один и тот же, существует одно важное отличие в этом процессе. При использовании <code>Object.create()</code> и {{jsxref("Function.prototype.apply()")}}, оператор <code>new.target</code> будет указывать на <code>undefined</code> внутри функции используемой в качестве конструктора, пока ключевое слово <code>new</code> не будет использовано для создания объекта.</p> + +<p>С другой стороны, в случае вызова <code>Reflect.construct()</code>, оператор <code>new.target</code> будет указывать на параметр <code>newTarget</code> если он задан, или <code>target</code> в отличном случае.</p> + +<pre class="brush: js">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 +</pre> + +<h2 id="Примеры">Примеры</h2> + +<h3 id="Использования_Reflect.construct()">Использования <code>Reflect.construct()</code></h3> + +<pre class="brush: js">var d = Reflect.construct(Date, [1776, 6, 4]); +d instanceof Date; // true +d.getFullYear(); // 1776 +</pre> + +<h2 id="Спецификации">Спецификации</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + <tr> + <td>{{SpecName('ES2015', '#sec-reflect.construct', 'Reflect.construct')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-reflect.construct', 'Reflect.construct')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="Совместимость_с_браузерами">Совместимость с браузерами</h2> + + + +<p>{{Compat("javascript.builtins.Reflect.construct")}}</p> + +<h2 id="Смотрите_также">Смотрите также</h2> + +<ul> + <li>{{jsxref("Reflect")}}</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new"><code>new</code></a></li> + <li><a href="/en-US/docs/Web/JavaScript/Reference/Operators/new.target"><code>new.target</code></a></li> +</ul> |
