handler.construct()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

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

試してみましょう

function monster1(disposition) {
  this.disposition = disposition;
}

const handler1 = {
  construct(target, args) {
    console.log(`Creating a ${target.name}`);
    // Expected output: "Creating a monster1"

    return new target(...args);
  },
};

const proxy1 = new Proxy(monster1, handler1);

console.log(new proxy1("fierce").disposition);
// Expected output: "fierce"

構文

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

引数

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

target

ターゲットのコンストラクターオブジェクトです。

argumentsList

コンストラクターに渡された引数の入った配列 (Array) です。

newTarget

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

返値

construct メソッドは新しく作成されたオブジェクトを表すオブジェクトを返す必要があります。

解説

介入

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

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

不変条件

プロキシーの [[Construct]] 内部メソッドは、以下の不変条件に違反している場合、呼び出されるとトラップで TypeError が発生します。

  • target がコンストラクター自身でなければならない。
  • 返値は 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® 2025 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget

ブラウザーの互換性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
construct

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

関連情報