【JSリファレンス】getOwnPropertyDescriptorハンドラー(Proxy)
更新日:2024/06/14
getOwnPropertyDescriptorハンドラーは、Proxyコンストラクターに渡すハンドラーオブジェクトで使用可能なメソッドです。
Proxyオブジェクトの[[GetOwnProperty]]スロットが呼び出された時、ハンドラーで定義した関数が呼び出されます。
※[[GetOwnProperty]]スロットは、Object.getOwnPropertyDescriptor()など、プロパティからプロパティ記述子を取得するときに呼び出されます。
■構文
getOwnPropertyDescriptor: function( target, propertyKey ){ }
- target: 対象となるオブジェクト
- propertyKey: プロパティ名(文字列またはシンボル)
異なる場合、TypeError
■戻り値の補完
戻り値がオブジェクトで特定のプロパティが存在しない場合、次の条件でプロパティが追加され、最終的な結果となります。
※データ記述子は、 value または writable プロパティが存在するオブジェクトです。
※アクセサ記述子は、 get または set プロパティが存在するオブジェクトです。
■戻り値の検証
ハンドラーから値が返ると、targetのpropertyKeyに対応するプロパティからプロパティ記述子(以降はtarget記述子)が取得され、次の検証が行われます。
▶ ハンドラーの戻り値がundefined、かつ、target記述子がundefinedではない(プロパティが存在する)とき、次のどれかに一致するとTypeErrorです。
- target記述子のconfigurable属性が false
- targetが拡張不可(Object.isExtensible()の結果がfalse)
▶ ハンドラーの戻り値がオブジェクトのとき、次のどれかに一致するとTypeErrorです。
※戻り値オブジェクトは補完済みです。
- 戻り値オブジェクトとtarget記述子のconfigurable属性の値が異なる
▶ ハンドラーの戻り値がオブジェクト、かつ、target記述子のconfigurable属性が falseのとき、次のどれかに一致するとTypeErrorです。
※戻り値オブジェクトは補完済みです。
- 戻り値オブジェクトとtarget記述子のenumerable属性の値が異なる
- 戻り値オブジェクトとtarget記述子のタイプ(データまたはアクセサ)が異なる
- target記述子がアクセサで、戻り値オブジェクトとtarget記述子のget属性の値が異なる
- target記述子がアクセサで、戻り値オブジェクトとtarget記述子のset属性の値が異なる
- target記述子がデータで、戻り値オブジェクトとtarget記述子のwritable属性の値が異なる
- target記述子がデータ、かつ、target記述子のwritable属性が false で、戻り値オブジェクトとtarget記述子のvalue属性の値が異なる
▶ ハンドラーの戻り値がオブジェクト、かつ、オブジェクトのconfigurable属性が falseのとき、次のどれかに一致するとTypeErrorです。
※戻り値オブジェクトは補完済みです。
- target記述子がundefined、またはtarget記述子のconfigurable属性の値が true
- 戻り値オブジェクトのwriteable属性の値が false、かつ、target記述子のconfigurable属性の値が true
■使用例
const obj = {
1:100,2:100,
value:300
}
const handlerObj = {
// 数値インデックスを隠蔽する
getOwnPropertyDescriptor: function( target, propertyKey ){
return /^\d*$/.test( propertyKey ) ? undefined
: Reflect.getOwnPropertyDescriptor( target, propertyKey );
},
};
const proxyObj = new Proxy( obj ,handlerObj );
console.log( Object.getOwnPropertyDescriptor(proxyObj,"value") );
// 結果: { value: 300, writable: true, enumerable: true, configurable: true }
console.log( Object.getOwnPropertyDescriptor(proxyObj,"1") );
// 結果: undefined
console.log( Object.getOwnPropertyDescriptor(proxyObj,"2") );
// 結果: undefined
関連ページ
更新日:2024/06/14
スポンサーリンク
記事の内容について
![null](/img/own80.jpg)
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。