Reflect.construct()
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
静的なReflect.construct()
メソッドはnew
演算子のように、ただし関数として動作します。これはnew target(...args)
の呼び出しと同等です。このメソッドはオプションを追加することで、別なプロトタイプを指定することができます。
試してみましょう
function func1(a, b, c) { this.sum = a + b + c;}const args = [1, 2, 3];const object1 = new func1(...args);const object2 = Reflect.construct(func1, args);console.log(object2.sum);// Expected output: 6console.log(object1.sum);// Expected output: 6
構文
Reflect.construct(target, argumentsList);Reflect.construct(target, argumentsList, newTarget);
引数
target
呼び出し対象の関数。
argumentsList
配列風オブジェクトで、
target
の呼び出しの引数を指定する。newTarget
省略可プロトタイプを使用するコンストラクター。
new.target
も参照してください。newTarget
が存在しない場合は、既定値はtarget
になります。
返値
target
(または、もしあればnewTarget
) の新しいインスタンスで、target
にargumentsList
を渡してコンストラクターとして呼び出すことで初期化します。
例外
TypeError
:target
またはnewTarget
がコンストラクターではない場合。
解説
Reflect.construct()
とObject.create()
Reflect
が導入される前は、オブジェクトを構築するのにコンストラクターとプロトタイプの任意の組み合わせで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); // falseconsole.log(obj2 instanceof OneClass); // falseconsole.log(obj1 instanceof OtherClass); // trueconsole.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()
と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; // trued.getFullYear(); // 1776
仕様書
Specification |
---|
ECMAScript® 2026 Language Specification # sec-reflect.construct |
ブラウザーの互換性
関連情報
Reflect.construct
のポリフィルがcore-js
にありますReflect
new
new.target