handler.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptor() に対するトラップです。

構文

var p = new Proxy(target, {
  getOwnPropertyDescriptor: function(target, prop) {
  }
});

引数

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

target
ターゲットオブジェクトです。
prop
ディスクリプタを取得されるプロパティ名です。

戻り値

getOwnPropertyDescriptor メソッドはオブジェクト、または undefined を返さなければなりません。

説明

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

インターセプト

このトラップは下記の操作をインターセプトできます。:

不変条件

次の不変条件に違反している場合、プロキシは TypeError をスローします。:

  • getOwnPropertyDescriptor はオブジェクトか、または undefined を返さなければなりません。
  • プロパティがターゲットオブジェクトの設定不可な独自のプロパティとして存在する場合、存在しないとして報告されてはいけません。
  • プロパティがターゲットオブジェクトの独自のプロパティとして存在し、そのターゲットオブジェクトが拡張不可の場合、存在しないとして報告されてはいけません。
  • プロパティがターゲットオブジェクトの独自のプロパティとして存在せず、そのターゲットオブジェクトが拡張不可の場合、存在するとして報告されてはいけません。
  • プロパティがターゲットオブジェクトの独自のプロパティとして存在しないか、ターゲットオブジェクトの設定可能な独自のプロパティとして存在している場合、設定不可であるとして報告されてはいけません。
  • Object.getOwnPropertyDescriptor(target) の結果を Object.defineProperty に使用した時に、ターゲットオブジェクトに適用でき、例外をスローしません。

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

var p = new Proxy({ a: 20 }, {
  getOwnPropertyDescriptor: function(target, prop) {
    console.log('called: ' + prop);
    return { configurable: true, enumerable: true, value: 10 };
  }
});

console.log(Object.getOwnPropertyDescriptor(p, 'a').value); // "called: a"
                                                            // 10

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

var obj = { a: 10 };
Object.preventExtensions(obj);
var p = new Proxy(obj, {
  getOwnPropertyDescriptor: function(target, prop) {
    return undefined;
  }
});

Object.getOwnPropertyDescriptor(p, 'a'); // TypeError is thrown

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
[[GetOwnProperty]] の定義
標準 初期定義
ECMAScript Latest Draft (ECMA-262)
[[GetOwnProperty]] の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応491218 なし3610
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応4949 あり1836105.0

関連情報

ドキュメントのタグと貢献者

このページの貢献者: segayuu, SphinxKnight, shide55
最終更新者: segayuu,