--- 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 ---
静的な Reflect.construct()
メソッドは {{jsxref("Operators/new", "new")}} 演算子のように、ただし関数として動作します。これは new target(...args)
の呼び出しと同等です。このメソッドはオプションを追加することで、別なプロトタイプを指定することができます。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
Reflect.construct(target, argumentsList[, newTarget])
target
argumentsList
target
の呼び出しの引数を指定する。newTarget
{{optional_inline}}new.target
も参照してください。 newTarget
が存在しない場合は、既定値は target
になります。target
(または、もしあれば newTarget
) の新しいインスタンスで、 target
に argumentsList
を渡してコンストラクターとして呼び出すことで初期化します。
{{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")}}
new.target