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]] の定義

ブラウザーの互換性

BCD tables only load in the browser

関連情報