Microsoft Edge の機能を調べてみた - Reflect 編
Reflect は JavaScript でインターセプト(横取り)を行うことができ Proxy と同じメソッドを持つ。
主な使われ方は Proxy の中の処理で元の機能を返す場合によく使われると思われます。
Proxy とは違い Reflect は関数オブジェクトではないため、Reflect を new することはできません。
また、現状ブラウザで Reflect をサポートしているのは Microsoft Edge と Firefox だけです。
オブジェクトから値を取る
new できないため construct を使う
デフォルトの処理を返す
Proxy で機能をトラップすることができますが、トラップして自分のコードを書くと返り値があるものは、その処理を自分で書く必要が出てきます。
処理を自分で書くのは面倒ですので Reflect から処理を返します。
以下の例では in で has() を呼ばれたときに console.log を実行し、Reflect で元の動作の has を返すことでデフォルトと同じ動作を返しています。
また、set などは元のオブジェクト自体を引っ張ってきているので状況によっては Reflect を使わないでも何とかなる場合があります。
for-of でオブジェクトの名前を列挙したい
Symbol.iterator でオブジェクトをサポートしていないため for-of で操作することができません。
Reflect.enumerate() を使うことでキーを呼び出すことができます。
まとめ
Reflect 動作がわかりづらかったり、Proxy と機能がかぶっていたりで、不可思議な機能ですが、
今後、Proxy をメインに置いた JavaScript でのメタプログラミングに必須の機能となるのではないかと思っています。