handler.construct()

handler.construct() メソッドは new 演算子のトラップです。結果として得られるプロキシオブジェクトに対して新しい操作を有効にするためには、プロキシを初期化するために使われるターゲット自身が [[Construct]] 内部メソッドを持っていなければなりません(つまり、 new target が有効でなければなりません)。

構文

const p = new Proxy(target, {
  construct: function(target, argumentsList, newTarget) {
  }
});

引数

次の引数が construct() メソッドに渡されます。 this はハンドラーにバインドされます。

target
ターゲットオブジェクト
argumentsList
コンストラクタに対する引数のリスト
newTarget
上記の p に呼び出された元のコンストラクターです。

返値

construct メソッドはオブジェクトを返す必要があります。

解説

handler.construct() メソッドは new 操作に対するトラップです。

介入

このトラップは下記の操作に介入できます。

不変条件

以下の不変条件に違反している場合、プロキシは TypeError を発生します。

  • 結果が Object でならなければならない。

new 演算子のトラップ

次のコードでは new 操作をトラップします。

const p = new Proxy(function() {}, {
  construct: function(target, argumentsList, newTarget) {
    console.log('called: ' + argumentsList.join(', '));
    return { value: argumentsList[0] * 10 };
  }
});

console.log(new p(1).value); // "called: 1"
                             // 10

次のコードでは不変条件に違反します。

const p = new Proxy(function() {}, {
  construct: function(target, argumentsList, newTarget) {
    return 1;
  }
});

new p(); // TypeError is thrown

次のコードはプロキシを正しく初期化していません。プロキシの target の初期化は、それ自身が new 演算子に有効なコンストラクターでなければなりません。

const p = new Proxy({}, {
  construct: function(target, argumentsList, newTarget) {
    return {};
  }
});

new p(); // TypeError is thrown, "p" is not a constructor

仕様書

仕様書
ECMAScript (ECMA-262)
[[Construct]] の定義

ブラウザーの互換性

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

凡例

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

関連情報