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 Monster(disposition) {
this.disposition = disposition;
}
const handler = {
construct(target, args) {
console.log(`Creating a ${target.name}`);
// 予想される結果: "Creating a monster1"
return new target(...args);
},
};
const ProxiedMonster = new Proxy(Monster, handler);
console.log(new ProxiedMonster("fierce").disposition);
// 予想される結果: "fierce"
構文
new Proxy(target, {
construct(target, argumentsList, newTarget) {
}
})
引数
次の引数が construct() メソッドに渡されます。 this はハンドラーにバインドされます。
target-
ターゲットのコンストラクターオブジェクトです。
argumentsList-
コンストラクターに渡された引数の入った配列 (
Array) です。 newTarget-
呼び出された元のコンストラクターです。
返値
construct メソッドは新しく作成されたオブジェクトを表すオブジェクトを返す必要があります。
解説
>介入
このトラップは下記の操作に介入できます。
- The
new演算子:new myFunction(...args) Reflect.construct()
他にも、[[Construct]] 内部メソッドを呼び出すあらゆる操作に介入できます。
不変条件
プロキシーの [[Construct]] 内部メソッドは、以下の不変条件に違反している場合、呼び出されるとトラップで TypeError が発生します。
targetがコンストラクター自身でなければならない。- 返値は
Objectでなければならない。
例
>new 演算子のトラップ
次のコードでは new 操作をトラップします。
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
次のコードでは不変条件に違反します。
const p = new Proxy(function () {}, {
construct(target, argumentsList, newTarget) {
return 1;
},
});
new p(); // TypeError is thrown
次のコードはプロキシーを正しく初期化していません。プロキシーの target の初期化は、それ自身が new 演算子に有効なコンストラクターでなければなりません。
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> |
ブラウザーの互換性
Loading…