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