--- 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])
targetargumentsListtarget の呼び出しの引数を指定する。newTarget {{optional_inline}}new.target も参照してください。 newTarget が存在しない場合は、既定値は target になります。target (または、もしあれば newTarget) の新しいインスタンスで、 target に argumentsList を渡してコンストラクターとして呼び出すことで初期化します。
{{jsxref("TypeError")}}: target または newTarget がコンストラクターではない場合。
Reflect.construct() によって、可変長引数を指定してコンストラクターを呼び出すことができます。 (これは 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