handler.construct()
BaselineWidely 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
メソッドは新しく作成されたオブジェクトを表すオブジェクトを返す必要があります。
解説
介入
このトラップは下記の操作に介入できます。
- The
new
演算子:new myFunction(...args)
Reflect.construct()
他にも、[[Construct]]
内部メソッドを呼び出すあらゆる操作に介入できます。
不変条件
例
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 |