このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
Reflect.construct()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年9月.
静的なReflect.construct() メソッドはnew 演算子のように、ただし関数として動作します。これはnew target(...args) の呼び出しと同等です。このメソッドはオプションを追加することで、別なプロトタイプを指定することができます。
In this article
試してみましょう
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() によって、可変長引数を指定してコンストラクターを呼び出すことができます。 (これはスプレッド構文とnew 演算子を組み合わせて使用することでも可能です。)
let obj = new Foo(...args);let obj = Reflect.construct(Foo, args);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にありますReflectnewnew.target