JavaScriptのプロパティディスクリプタは、プロパティ1つ1つに対して変更や列挙、削除の可否を指定できる仕組みである。仕様では、プロパティの属性("attribute")と表現されている。
わかりやすく言えば、プロパティの設定を行うオブジェクトだ。
種類
プロパティディスクリプタには、データプロパティとアクセサプロパティの2種類がある。
指定できるのはいずれか一方のみで、両方指定しようとすると型エラーが投げられる。注意したい。
データプロパティ
データプロパティは、プロパティの値に関する設定を担う。以下の4つのプロパティが該当する。プロパティという語が連発しててわかりづらい。データプロパティはディスクリプタのプロパティで、単純なプロパティはそのディスクリプタの設定対象を指す。
プロパティ | 概要 |
---|---|
[[Value]] |
プロパティの値。 |
[[Writable]] |
プロパティの値を変えられるかどうかを指定するフラグ。 |
[[Configurable]] |
プロパティの削除や属性(ディスクリプタの内容)を変えられるかどうかを指定するフラグ。[[Writable]] がtrue の場合、このフラグがfalse でもプロパティの値を変更できる。 |
[[Enumerable]] |
プロパティをfor...in あるいはObject.keys() を使ったループでイテレートできるかどうかを指定するフラグ。 |
アクセサディスクリプタ
アクセサディスクリプタは、要はclass
構文でお馴染みのゲッターとセッターである。プロパティが参照されたり、代入されたりする際に実行する関数オブジェクトを指定する。
プロパティ | 概要 |
---|---|
[[Get]] |
プロパティが参照される際に実行する関数オブジェクトを指定する。 |
[[Set]] |
プロパティに値が代入される際に実行する関数オブジェクトを指定する。 |
[[Configurable]] |
同じなので割愛。 |
[[Enumerable]] |
同じなので割愛。 |
設定方法
プロパティディスクリプタの設定は、Object.defineProperty()メソッドあるいはObject.defineProperties()メソッドを使って行う。以下、データプロパティのフラグをぜんぶfalse
にした例である。
1
を代入してもprop
の値が変化せず、またfor...in
は回らず、delete
でも削除されていないことがわかる。
なお、strict
モードでは、書き込もうとしたり、削除しようとしたタイミングで型エラーが出て処理が停止する。
取得方法
プロパティのディスクリプタを取得したい場合には、Object.defineProperty()メソッドあるいはObject.getOwnPropertyDescriptor()を使う。