diff options
author | Masahiro FUJIMOTO <mfujimot@gmail.com> | 2021-08-28 21:02:57 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-28 21:02:57 +0900 |
commit | e2b6fc2fd48db513519e1db978dc043a01a43b58 (patch) | |
tree | 2d363f0f615680962bd3b90acf8818e1024fb2e2 | |
parent | 66b9046f6909a588560eb44882cc74ab7b489d14 (diff) | |
download | translated-content-e2b6fc2fd48db513519e1db978dc043a01a43b58.tar.gz translated-content-e2b6fc2fd48db513519e1db978dc043a01a43b58.tar.bz2 translated-content-e2b6fc2fd48db513519e1db978dc043a01a43b58.zip |
Web/JavaScript/Reference/Global_Objects/Reflect/construct を更新 (#2117)
- Markdown化
- 文書を最新の英語版に同期
-rw-r--r-- | files/ja/web/javascript/reference/global_objects/reflect/construct/index.html | 146 | ||||
-rw-r--r-- | files/ja/web/javascript/reference/global_objects/reflect/construct/index.md | 148 |
2 files changed, 148 insertions, 146 deletions
diff --git a/files/ja/web/javascript/reference/global_objects/reflect/construct/index.html b/files/ja/web/javascript/reference/global_objects/reflect/construct/index.html deleted file mode 100644 index 9bfefa49e2..0000000000 --- a/files/ja/web/javascript/reference/global_objects/reflect/construct/index.html +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: Reflect.construct() -slug: Web/JavaScript/Reference/Global_Objects/Reflect/construct -tags: - - ECMAScript 2015 - - JavaScript - - Method - - Reference - - Reflect - - メソッド -translation_of: Web/JavaScript/Reference/Global_Objects/Reflect/construct ---- -<div>{{JSRef}}</div> - -<p>静的な <code><strong>Reflect.construct()</strong></code> メソッドは {{jsxref("Operators/new", "new")}} 演算子のように、ただし関数として動作します。これは <code>new target(...args)</code> の呼び出しと同等です。このメソッドはオプションを追加することで、別なプロトタイプを指定することができます。</p> - -<div>{{EmbedInteractiveExample("pages/js/reflect-construct.html", "taller")}}</div> - -<p class="hidden">このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> をクローンしてプルリクエストを送信してください。</p> - -<h2 id="Syntax" name="Syntax">構文</h2> - -<pre class="syntaxbox">Reflect.construct(<var>target</var>, <var>argumentsList</var>[, <var>newTarget</var>]) -</pre> - -<h3 id="Parameters" name="Parameters">引数</h3> - -<dl> - <dt><code><var>target</var></code></dt> - <dd>呼び出し対象の関数。</dd> - <dt><code><var>argumentsList</var></code></dt> - <dd>配列風オブジェクトで、 <code><var>target</var></code> の呼び出しの引数を指定する。</dd> - <dt><code><var>newTarget</var></code> {{optional_inline}}</dt> - <dd>プロトタイプを使用するコンストラクター。 <a href="/ja/docs/Web/JavaScript/Reference/Operators/new.target"><code>new.target</code></a> も参照してください。 <code><var>newTarget</var></code> が存在しない場合は、既定値は <code><var>target</var></code> になります。</dd> -</dl> - -<h3 id="Return_value" name="Return_value">返値</h3> - -<p><code><var>target</var></code> (または、もしあれば <code><var>newTarget</var></code>) の新しいインスタンスで、 <code><var>target</var></code> に <code><var>argumentsList</var></code> を渡してコンストラクターとして呼び出すことで初期化します。</p> - -<h3 id="Exceptions" name="Exceptions">例外</h3> - -<p>{{jsxref("TypeError")}}: <code><var>target</var></code> または <code><var>newTarget</var></code> がコンストラクターではない場合。</p> - -<h2 id="Description" name="Description">解説</h2> - -<p><code>Reflect.construct()</code> によって、可変長引数を指定してコンストラクターを呼び出すことができます。 (これは <a href="/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax">スプレッド構文と<a href="/ja/docs/Web/JavaScript/Reference/Operators/new"><code>new</code> 演算子</a> を組み合わせて使用することでも可能です。)</p> - -<pre class="brush: js">let obj = new Foo(...<var>args</var>) -let obj = Reflect.construct(Foo, <var>args</var>) -</pre> - -<h3 id="Reflect.construct_vs_Object.create" name="Reflect.construct_vs_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' -} - -// この呼び出しは、 -let obj1 = Reflect.construct(OneClass, <var>args</var>, OtherClass) - -// ...これと同じ結果をもたらします。 -let obj2 = Object.create(OtherClass.prototype) -OneClass.apply(obj2, <var>args</var>) - -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>この2つの手法の最終結果は同じですが、その過程に重要な違いがあります。 <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><var>newTarget</var></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) -} - -let obj1 = Reflect.construct(OneClass, <var>args</var>) -// Output: -// OneClass -// function OneClass { ... } - -let obj2 = Reflect.construct(OneClass, <var>args</var>, OtherClass) -// Output: -// OneClass -// function OtherClass { ... } - -let obj3 = Object.create(OtherClass.prototype); -OneClass.apply(obj3, <var>args</var>) -// Output: -// OneClass -// undefined -</pre> - -<h2 id="Examples" name="Examples">例</h2> - -<h3 id="Using_Reflect.construct" name="Using_Reflect.construct"><code>Reflect.construct()</code> の使用</h3> - -<pre class="brush: js">let d = Reflect.construct(Date, [1776, 6, 4]) -d instanceof Date // true -d.getFullYear() // 1776 -</pre> - -<h2 id="Specifications" name="Specifications">仕様書</h2> - -<table class="standard-table"> - <thead> - <tr> - <th scope="col">仕様書</th> - </tr> - </thead> - <tbody> - <tr> - <td>{{SpecName('ESDraft', '#sec-reflect.construct', 'Reflect.construct')}}</td> - </tr> - </tbody> -</table> - -<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2> - -<p>{{Compat("javascript.builtins.Reflect.construct")}}</p> - -<h2 id="See_also" name="See_also">関連情報</h2> - -<ul> - <li>{{jsxref("Reflect")}}</li> - <li>{{jsxref("Operators/new", "new")}}</li> - <li><code><a href="/ja/docs/Web/JavaScript/Reference/Operators/new.target">new.target</a></code></li> -</ul> diff --git a/files/ja/web/javascript/reference/global_objects/reflect/construct/index.md b/files/ja/web/javascript/reference/global_objects/reflect/construct/index.md new file mode 100644 index 0000000000..5cc425fa6d --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/reflect/construct/index.md @@ -0,0 +1,148 @@ +--- +title: Reflect.construct() +slug: Web/JavaScript/Reference/Global_Objects/Reflect/construct +tags: + - ECMAScript 2015 + - JavaScript + - Method + - Reference + - Reflect + - Polyfill +browser-compat: javascript.builtins.Reflect.construct +translation_of: Web/JavaScript/Reference/Global_Objects/Reflect/construct +--- +{{JSRef}} + +静的な **`Reflect.construct()`** メソッドは {{jsxref("Operators/new", "new")}} 演算子のように、ただし関数として動作します。これは `new target(...args)` の呼び出しと同等です。このメソッドはオプションを追加することで、別なプロトタイプを指定することができます。 + +{{EmbedInteractiveExample("pages/js/reflect-construct.html", "taller")}} + +## 構文 + +```js +Reflect.construct(target, argumentsList) +Reflect.construct(target, argumentsList, newTarget) +``` + +### 引数 + +- `target` + - : 呼び出し対象の関数。 +- `argumentsList` + - : 配列風オブジェクトで、 `target` の呼び出しの引数を指定する。 +- `newTarget` {{optional_inline}} + - : プロトタイプを使用するコンストラクター。 [`new.target`](/ja/docs/Web/JavaScript/Reference/Operators/new.target) も参照してください。 `newTarget` が存在しない場合は、既定値は `target` になります。 + +### 返値 + +`target` (または、もしあれば `newTarget`) の新しいインスタンスで、 `target` に `argumentsList` を渡してコンストラクターとして呼び出すことで初期化します。 + +### 例外 + +{{jsxref("TypeError")}}: `target` または `newTarget` がコンストラクターではない場合。 + +## 解説 + +`Reflect.construct()` によって、可変長引数を指定してコンストラクターを呼び出すことができます。 (これは[スプレッド構文](/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)と[`new` 演算子](/ja/docs/Web/JavaScript/Reference/Operators/new)を組み合わせて使用することでも可能です。) + +```js +let obj = new Foo(...args) +let obj = Reflect.construct(Foo, args) +``` + +### `Reflect.construct()` と `Object.create()` + +`Reflect` が導入される前は、オブジェクトを構築するのにコンストラクターとプロトタイプの任意の組み合わせで {{jsxref("Object.create()")}} を使用して構築することができました。 + + function OneClass() { + this.name = 'one' + } + + function OtherClass() { + this.name = 'other' + } + + // Calling this: + let obj1 = Reflect.construct(OneClass, args, OtherClass) + + // ...has the same result as this: + let 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 + + //Another example to demonstrate below: + + function func1(a, b, c, d) { + console.log(arguments[3]); + } + + function func2(d, e, f, g) { + console.log(arguments[3]); + } + + let obj1 = Reflect.construct(func1, ['I', 'Love', 'my', 'India']) + obj1 + +この 2 つの手法の最終結果は同じですが、その過程に重要な違いがあります。 `Object.create()` と {{jsxref("Function.prototype.apply()")}} を使用する場合、 `new.target` 演算子はコンストラクター内で `undefined` を返します。これは、 `new` 演算子を用いないためです。 + +一方、 `Reflect.construct()` を呼び出す場合は、 `new.target` 演算子は、提供されていれば `newTarget` を指し、そうでなければ `target` を指します。 + +```js +function OneClass() { + console.log('OneClass') + console.log(new.target) +} +function OtherClass() { + console.log('OtherClass') + console.log(new.target) +} + +let obj1 = Reflect.construct(OneClass, args) +// Output: +// OneClass +// function OneClass { ... } + +let obj2 = Reflect.construct(OneClass, args, OtherClass) +// Output: +// OneClass +// function OtherClass { ... } + +let obj3 = Object.create(OtherClass.prototype); +OneClass.apply(obj3, args) +// Output: +// OneClass +// undefined +``` + +## 例 + +### `Reflect.construct()` の使用 + +```js +let d = Reflect.construct(Date, [1776, 6, 4]) +d instanceof Date // true +d.getFullYear() // 1776 +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- `Reflect.construct` のポリフィルが [`core-js`](https://github.com/zloirock/core-js#ecmascript-reflect) にあります +- {{jsxref("Reflect")}} +- {{jsxref("Operators/new", "new")}} +- [`new.target`](/ja/docs/Web/JavaScript/Reference/Operators/new.target) |