このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

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 ⁨2016年9月⁩.

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® 2026 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget

ブラウザーの互換性

関連情報