From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../global_objects/reflect/construct/index.html | 148 +++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 files/ja/web/javascript/reference/global_objects/reflect/construct/index.html (limited to 'files/ja/web/javascript/reference/global_objects/reflect/construct/index.html') 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 new file mode 100644 index 0000000000..f16711c6f7 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/reflect/construct/index.html @@ -0,0 +1,148 @@ +--- +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 +--- +
{{JSRef}}
+ +

静的な Reflect.construct() メソッドは {{jsxref("Operators/new", "new")}} 演算子のように、ただし関数として動作します。これは new target(...args) の呼び出しと同等です。このメソッドはオプションを追加することで、別なプロトタイプを指定することができます。

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

構文

+ +
Reflect.construct(target, argumentsList[, newTarget])
+
+ +

引数

+ +
+
target
+
呼び出し対象の関数。
+
argumentsList
+
配列風オブジェクトで、 target の呼び出しの引数を指定する。
+
newTarget {{optional_inline}}
+
プロトタイプを使用するコンストラクター。 new.target も参照してください。 newTarget が存在しない場合は、既定値は target になります。
+
+ +

返値

+ +

target (または、もしあれば newTarget) の新しいインスタンスで、 targetargumentsList を渡してコンストラクターとして呼び出すことで初期化します。

+ +

例外

+ +

{{jsxref("TypeError")}}: target または newTarget がコンストラクターではない場合。

+ +

解説

+ +

Reflect.construct() によって、可変長引数を指定してコンストラクターを呼び出すことができます。 (これは a href="/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax">スプレッド構文とnew 演算子 を組み合わせて使用することでも可能です。)

+ +
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'
+}
+
+// この呼び出しは、
+let obj1 = Reflect.construct(OneClass, args, OtherClass)
+
+// ...これと同じ結果をもたらします。
+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
+
+ +

この2つの手法の最終結果は同じですが、その過程に重要な違いがあります。 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)
+}
+
+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() の使用

+ +
let d = Reflect.construct(Date, [1776, 6, 4])
+d instanceof Date  // true
+d.getFullYear()    // 1776
+
+ +

仕様書

+ + + + + + + + + + + + +
仕様書
{{SpecName('ESDraft', '#sec-reflect.construct', 'Reflect.construct')}}
+ +

ブラウザーの互換性

+ + + +

{{Compat("javascript.builtins.Reflect.construct")}}

+ +

関連情報

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