Reflect.construct() 静的メソッドは、機能として new 演算子のように働きます。これは、new target(...args) の呼び出しと同等です。このメソッドはオプションを追加することで、prototype を変更します。

構文

Reflect.construct(target, argumentsList[, newTarget])

パラメータ

target
呼び出し対象の関数。
argumentsList
target と一緒に呼び出されるべき引数を指定する配列様のオブジェクト。
newTarget Optional
使用されるコンストラクタ。new.target 演算子も見てください。newTarget が提供されない場合、 targetが使用されます。

戻り値

渡された引数をもとに target コンストラクタで初期化された target (newTarget を渡されたならば newTarget )の新しいインスタンスを返します。

スローされる例外

target または newTarget がコンストラクタではない場合、TypeError がスローされます。

説明

Reflect.construct では、可変長引数とともにコンストラクタを起動できます。(new 演算子と組み合わせてspread 演算子を使うこともできます)。

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

 

Reflect.construct() と Object.create()

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

function OneClass() {
    this.name = 'one';
}

function OtherClass() {
    this.name = 'other';
}

// Calling this:
var obj1 = Reflect.construct(OneClass, args, OtherClass);

// ...has the same result as this:
var 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() と Function.prototype.apply() を使用する場合、new 演算子を用いないため、 new.target 演算子はコンストラクタ内で undefined を返します。

一方、Reflect.construct() を使用する場合、 new.target 演算子は、newTarget を渡されたならそれを、渡されなかった場合は target を返します。

function OneClass() {
    console.log('OneClass');
    console.log(new.target);
}
function OtherClass() {
    console.log('OtherClass');
    console.log(new.target);
}

var obj1 = Reflect.construct(OneClass, args);
// Output:
//     OneClass
//     function OneClass { ... }

var obj2 = Reflect.construct(OneClass, args, OtherClass);
// Output:
//     OneClass
//     function OtherClass { ... }

var obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj2, args);
// Output:
//     OneClass
//     undefined

 

Reflect.construct() の使用

var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776

仕様

仕様 状態 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Reflect.construct の定義
標準 初期定義
ECMAScript Latest Draft (ECMA-262)
Reflect.construct の定義
ドラフト  

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
基本対応Chrome 完全対応 49Edge 完全対応 12Firefox 完全対応 42IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Edge Mobile 完全対応 ありFirefox Android 完全対応 42Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連項目

ドキュメントのタグと貢献者

このページの貢献者: segayuu, SphinxKnight, kazu69, YuichiNukiyama
最終更新者: segayuu,