handler.has()

handler.has()in 演算子に対するトラップです。

構文

const p = new Proxy(target, {
  has: function(target, prop) {
  }
});

引数

次の引数は has() メソッドに渡されます。 this はハンドラーにバインドされます。

target
ターゲットオブジェクトです。
prop
存在を確認するプロパティ名です。

返値

has メソッドは真偽値を返さなければなりません。

解説

handler.has() メソッドは in 演算子に対するトラップです。

介入

このトラップは下記の操作に介入できます。

  • プロパティクエリ: foo in proxy
  • 継承したプロパティクエリ: foo in Object.create(proxy)
  • with チェック: with(proxy) { (foo); }
  • Reflect.has()

不変条件

以下の不変条件に違反している場合、プロキシは TypeError を発生します。

  • プロパティがターゲットオブジェクトの設定不可の独自プロパティとして存在する場合、存在しないとして報告されてはいけません。
  • プロパティがターゲットオブジェクトの独自プロパティとして存在し、そのターゲットオブジェクトが拡張不可の場合、存在しないとして報告されてはいけません。

in 演算子のトラップ

次のコードでは in 演算子をトラップします。

const p = new Proxy({}, {
  has: function(target, prop) {
    console.log('called: ' + prop);
    return true;
  }
});

console.log('a' in p); // "called: a"
                       // true

次のコードでは不変条件に違反します。

const obj = { a: 10 };
Object.preventExtensions(obj);

const p = new Proxy(obj, {
  has: function(target, prop) {
    return false;
  }
});

'a' in p; // TypeError is thrown

仕様書

仕様書
ECMAScript (ECMA-262)
[[HasProperty]] の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
hasChrome 完全対応 49Edge 完全対応 12Firefox 完全対応 18IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 18Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連情報