JavaScriptのProxyとReflectについて
JavaScriptのProxyとReflectについて、簡単にまとめました。
Proxyとは
Proxyとは、プロパティの操作に独自の処理を追加するためのオブジェクトのことです。
第一引数にターゲットとなるオブジェクト、第二引数にhandlerという第一引数のオブジェクトを操作するメソッドが格納されているオブジェクトを指定します。
handlerのsetには4つ引数が渡ってきます。Proxyの第一引数のオブジェクト、第二引数はプロパティ、第三引数はsetの場合は可能した新しい値、第4引数はreceiverです。
receiverは、proxyのオブジェクトが渡ってきます。下の例でいうと、proxyObjです。
トラップしたsetの中でtarget[prop] = valueと値をセットすることで、
targetObjのプロパティの値を変更するまえに、なんらかの処理をすることができます。
値の変更を検知して、独自の処理をすることができます。
getの場合は、値の取得が行われたときの処理を追加できます。
getは新しい値は渡されないので、valueはありません。
deletePropertyで値を削除するときの検知をすることができます。
deletePropertyにはreceiverは渡ってきません。
値の変更を許可しないようにする
一般的なオブジェクトをproxy経由で値を参照することで、独自の操作を追加することができます。
このように、throwでエラーを設定することで値を新たにsetしたり、getしたり、deleteすることができないように設定することができます。
値が見つからなかった場合のデフォルト値を簡単に設定する
また、getでは、値が見つからなかった場合のデフォルト値を簡単に設定することができます。
Reflectとは
Reflectとは、JavaScriptエンジンの内部の汎用的な関数を呼び出すメソッドが格納されているオブジェクトです。
Reflectを使うことで、関数表記で意図的に内部メソッドにアクセスすることができます。
内部のメソッドとは、例えばset, get, delete, constructなどです。
[[Get]]などと二重の角括弧で囲われているメソッドです。
Reflectは内部メソッドを呼び出す関数の格納場所として使ったり、proxyと合わせて使います。
new演算子を用いていたところを、関数表記にできる点はreflectの特徴です。
in演算子はreflectのhasで書き換えることができます。
また、静的メソッドをreflectに移植することもできます。
ほぼ同じでReflectではtry-chatchを使う必要がなく、true/falseで使えます。