handler.has()
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.
試してみましょう
構文
js
new Proxy(target, {
has(target, prop) {
}
});
引数
返値
has
メソッドは論理値を返さなければなりません。
解説
介入
このトラップは下記の操作に介入できます。
in
演算子:foo in proxy
with
チェック:with(proxy) { (foo); }
Reflect.has()
他にも、[[HasProperty]]
内部メソッドを呼び出すあらゆる操作に介入できます。
不変条件
以下の不変条件に違反している場合、プロキシーは TypeError
を発生します。
- プロパティがターゲットオブジェクトの設定不可の独自プロパティとして存在する場合、存在しないとして報告されてはいけません。
- プロパティがターゲットオブジェクトの独自プロパティとして存在し、そのターゲットオブジェクトが拡張不可の場合、存在しないとして報告されてはいけません。
例
in 演算子のトラップ
次のコードでは in
演算子をトラップします。
js
const p = new Proxy(
{},
{
has(target, prop) {
console.log(`called: ${prop}`);
return true;
},
},
);
console.log("a" in p);
// "called: a"
// true
次のコードでは不変条件に違反します。
js
const obj = { a: 10 };
Object.preventExtensions(obj);
const p = new Proxy(obj, {
has(target, prop) {
return false;
},
});
"a" in p; // TypeError is thrown
仕様書
Specification |
---|
ECMAScript Language Specification # sec-proxy-object-internal-methods-and-internal-slots-hasproperty-p |
ブラウザーの互換性
BCD tables only load in the browser