Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

Reflect.construct()

BaselineWidely available

静的な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

構文

js
Reflect.construct(target, argumentsList);Reflect.construct(target, argumentsList, newTarget);

引数

target

呼び出し対象の関数。

argumentsList

配列風オブジェクトで、target の呼び出しの引数を指定する。

newTarget省略可

プロトタイプを使用するコンストラクター。new.target も参照してください。newTarget が存在しない場合は、既定値はtarget になります。

返値

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

例外

TypeError:target またはnewTarget がコンストラクターではない場合。

解説

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

js
let obj = new Foo(...args);let obj = Reflect.construct(Foo, args);

Reflect.construct()Object.create()

Reflect が導入される前は、オブジェクトを構築するのにコンストラクターとプロトタイプの任意の組み合わせでObject.create() を使用して構築することができました。

js
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 を指します。

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; // trued.getFullYear(); // 1776

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-reflect.construct

ブラウザーの互換性

関連情報

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp