【JSリファレンス】getOwnPropertyDescriptorハンドラー(Proxy)

更新日:2024/06/14

getOwnPropertyDescriptorハンドラーは、Proxyコンストラクターに渡すハンドラーオブジェクトで使用可能なメソッドです。

Proxyオブジェクト[[GetOwnProperty]]スロットが呼び出された時、ハンドラーで定義した関数が呼び出されます。

[[GetOwnProperty]]スロットは、Object.getOwnPropertyDescriptor()など、プロパティからプロパティ記述子を取得するときに呼び出されます。

 

■構文

getOwnPropertyDescriptor: function( target, propertyKey ){ }
  1. target: 対象となるオブジェクト
  2. propertyKey: プロパティ名(文字列またはシンボル)
オブジェクトまたはundefined

異なる場合、TypeError

 

■戻り値の補完

戻り値がオブジェクトで特定のプロパティが存在しない場合、次の条件でプロパティが追加され、最終的な結果となります。

  • オブジェクトがデータ記述子の場合
    value: undefined 、 writable: false を追加
  • オブジェクトがアクセサ記述子の場合
    get: undefined 、 set: undefined を追加
  • データ記述子およびアクセサ記述子でない場合
    value: undefined 、 writable: false を追加
  • 共通
    enumerable: false 、 cnfigurable: false を追加

※データ記述子は、 value または writable プロパティが存在するオブジェクトです。

※アクセサ記述子は、 get または set プロパティが存在するオブジェクトです。

 

■戻り値の検証

ハンドラーから値が返ると、targetpropertyKeyに対応するプロパティからプロパティ記述子(以降はtarget記述子)が取得され、次の検証が行われます。

▶ ハンドラーの戻り値がundefined、かつ、target記述子undefinedではない(プロパティが存在する)とき、次のどれかに一致するとTypeErrorです。

▶ ハンドラーの戻り値がオブジェクトのとき、次のどれかに一致するとTypeErrorです。
※戻り値オブジェクトは補完済みです。

▶ ハンドラーの戻り値がオブジェクト、かつ、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です。
※戻り値オブジェクトは補完済みです。

 

■使用例

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

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。