handler.ownKeys()

handler.ownKeys() メソッドは Reflect.ownKeys() に対するトラップです。

構文

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

引数

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

target
ターゲットオブジェクトです。

返値

ownKeys() メソッドは列挙可能オブジェクトを返さなければなりません。

解説

handler.ownKeys() メソッドは Reflect.ownKeys() に対するトラップです。

介入

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

不変条件

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

  • ownKeysの結果はリストです。
  • 結果リストのそれぞれの要素の型はString または Symbolのどちらかです。
  • 結果リストはターゲットオブジェクトのすべての非設定の独自プロパティのキーを含みます。
  • ターゲットオブジェクトが拡張可能でないなら、結果リストはターゲットオブジェクトのすべての独自プロパティのキーを含まなければなりません。そして、他の値を含みません。

getOwnPropertyNames のトラップ

次のコードでは Object.getOwnPropertyNames() をトラップします。

const p = new Proxy({}, {
  ownKeys: function(target) {
    console.log('called');
    return ['a', 'b', 'c'];
  }
});

console.log(Object.getOwnPropertyNames(p)); // "called"
                                            // [ 'a', 'b', 'c' ]

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

const obj = {};
Object.defineProperty(obj, 'a', { 
  configurable: false, 
  enumerable: true, 
  value: 10 }
);

const p = new Proxy(obj, {
  ownKeys: function(target) {
    return [123, 12.5, true, false, undefined, null, {}, []];
  }
});

console.log(Object.getOwnPropertyNames(p)); 

// TypeError: proxy [[OwnPropertyKeys]] must return an array 
// with only string and symbol elements

仕様書

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

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
ownKeysChrome 完全対応 49Edge 完全対応 12Firefox 完全対応 18
補足
完全対応 18
補足
補足 In Firefox 42, the implementation got updated to reflect the final ES2015 specification: The result is now checked if it is an array and if the array elements are either of type string or of type symbol. Enumerating duplicate own property names is not a failure anymore.
IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 18
補足
完全対応 18
補足
補足 In Firefox 42, the implementation got updated to reflect the final ES2015 specification: The result is now checked if it is an array and if the array elements are either of type string or of type symbol. Enumerating duplicate own property names is not a failure anymore.
Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0

凡例

完全対応  
完全対応
未対応  
未対応
実装ノートを参照してください。
実装ノートを参照してください。

関連情報