handler.construct()

handler.construct() メソッドは、オブジェクトの [[Construct]] 内部メソッドに対するトラップです。new 演算子などの操作で使用されます。結果としてのプロキシーオブジェクトが new 演算子を使用できるようにするためには、プロキシを初期化するために使用されるターゲット自体が有効なコンストラクターである必要があります。

試してみましょう

構文

js
new Proxy(target, {
  construct(target, argumentsList, newTarget) {
  }
});

引数

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

target

ターゲットオブジェクト

argumentsList

コンストラクタに対する引数のリスト

newTarget

上記の p に呼び出された元のコンストラクターです。

返値

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

解説

介入

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

他にも、[[Construct]] 内部メソッドを呼び出すあらゆる操作に介入できます。

不変条件

以下の不変条件に違反している場合、呼び出されるとトラップで TypeError が発生します。

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

new 演算子のトラップ

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

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

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

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

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

new p(); // TypeError is thrown

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

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

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

仕様書

Specification
ECMAScript Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget

ブラウザーの互換性

BCD tables only load in the browser

関連情報