handler.construct()
試してみましょう
handler.construct()
メソッドは new
演算子のトラップです。結果として得られるプロキシオブジェクトに対して新しい操作を有効にするためには、プロキシを初期化するために使われるターゲット自身が [[Construct]]
内部メソッドを持っていなければなりません(つまり、 new target
が有効でなければなりません)。
構文
const p = new Proxy(target, {
construct: function(target, argumentsList, newTarget) {
}
});
引数
次の引数が construct()
メソッドに渡されます。 this
はハンドラーにバインドされます。
target
- ターゲットオブジェクト
argumentsList
- コンストラクタに対する引数のリスト
newTarget
- 上記の
p
に呼び出された元のコンストラクターです。
返値
construct
メソッドはオブジェクトを返す必要があります。
解説
handler.construct()
メソッドは new
操作に対するトラップです。
介入
このトラップは下記の操作に介入できます。
new proxy(...args)
Reflect.construct()
不変条件
以下の不変条件に違反している場合、プロキシは TypeError
を発生します。
- 結果が
Object
でならなければならない。
例
new 演算子のトラップ
次のコードでは new
操作をトラップします。
const p = new Proxy(function() {}, {
construct: function(target, argumentsList, newTarget) {
console.log('called: ' + argumentsList.join(', '));
return { value: argumentsList[0] * 10 };
}
});
console.log(new p(1).value); // "called: 1"
// 10
次のコードでは不変条件に違反します。
const p = new Proxy(function() {}, {
construct: function(target, argumentsList, newTarget) {
return 1;
}
});
new p(); // TypeError is thrown
次のコードはプロキシを正しく初期化していません。プロキシの target
の初期化は、それ自身が new
演算子に有効なコンストラクターでなければなりません。
const p = new Proxy({}, {
construct: function(target, argumentsList, newTarget) {
return {};
}
});
new p(); // TypeError is thrown, "p" is not a constructor
仕様書
ブラウザーの互換性
BCD tables only load in the browser
関連情報
Proxy
handler
new
operator.Reflect.construct()