Reflect
は、プロパティの取得、設定、削除、存在確認といった任意のオブジェクトに対する操作を、一貫した方法で実現するオブジェクトである。
Reflect
オブジェクトは静的インスタンスで、コンストラクタではない。Math
オブジェクトやJSON
オブジェクトのように、グローバルオブジェクトをそのまま使う。
使いどころ
Reflect
オブジェクトは、主にProxy
オブジェクトと組み合わせて使うことを前提に設計されている。そのためReflect
オブジェクトが持つ静的関数には、Proxy
オブジェクトのトラップと呼ばれるプロパティ群と同じ名前がつけられている。
Proxy
オブジェクトは、ターゲットとなるオブジェクトの処理をインターセプトし、任意に再定義する機能を持つ。トラップは、この再定義する1つ1つの処理に対応するプロパティ(関数)である。
Reflect
が元のオブジェクトの値を転送し、Proxy
があれこれする(あるいはその逆)ようなイメージで使われる。
使い方
Reflect
オブジェクトは、Proxy
オブジェクトと組み合わせて使うのが一般的である。
Reflect
オブジェクトのほぼすべてのメソッドは、他の構文やメソッドで代替できる。また、微妙な違いこそあるものの、そのうちのいくつかはObject
オブジェクトの同名の静的メソッドに対応している。
なので、やはりProxy
オブジェクトと組み合わせた使い方をするのが妥当である。
引用元:Reflect – JavaScript | MDN
上記のサンプルコードでは、オブジェクトのプロパティが削除された際にログを出力する。
この例では、別にdelete
キーワードを使っても良いが、一貫した方法でオブジェクトに対する操作を記述できるため、Reflect
が推奨される。ほんとうにそれだけがReflect
のメリットなのかどうかは知らない。
メソッド一覧
メソッド名 | 概要 |
---|---|
apply(target, thisArgument, argumentsList) |
target に渡されたメソッドを指定されたthis と引数のリストで実行する。 |
Reflect.construct(target, argumentsList) |
target に渡されたコンストラクタ関数を、指定された引数で実行する。 |
Reflect.construct(target, argumentsList, newTarget) |
同上。newTarget は、new.target を指定したい際に使う。 |
Reflect.defineProperty(target, propertyKey, attributes) |
target に渡されたオブジェクトに、指定された引数を元にして新しいプロパティを追加する。 |
Reflect.deleteProperty(target, propertyKey) |
target に渡されたオブジェクトから指定されたプロパティを削除する。 |
Reflect.get(target, propertyKey) |
target に渡されたオブジェクトから、指定されたキーの値を取得する。 |
Reflect.get(target, propertyKey, receiver) |
同上。receiver は、getter が呼び出されたときにthis の値を指定したいときに使う。 |
Reflect.getOwnPropertyDescriptor(target, propertyKey) |
target に渡されたオブジェクトに、指定されたディスクリプたがある場合はそれを返す。なければundefined を返す。 |
Reflect.getPrototypeOf(target) |
target に渡されたオブジェクトのプロトタイプを返す。 |
Reflect.has(target, propertyKey) |
target に渡されたオブジェクトが、渡されたキーのプロパティを持つかどうかを真偽値で返す。 |
Reflect.isExtensible(target) |
target に渡されたオブジェクトが、拡張可能かどうかを真偽値で返す。 |
Reflect.ownKeys(target) |
target に渡されたオブジェクトのキーの配列を返す。 |
Reflect.preventExtensions(target) |
target に渡されたオブジェクトを拡張不能にする。成功したら真、失敗したら偽を返す。 |
Reflect.set(target, propertyKey, value) |
target に渡されたオブジェクトの、指定されたキーに値を設定する。 |
Reflect.set(target, propertyKey, value, receiver) |
同上。setter が呼び出されたときにthis の値を指定したいときに使う。 |
Reflect.setPrototypeOf(target, prototype) |
target に渡されたオブジェクトに新たなプロトタイプを設定する。成功したら真、失敗したら偽を返す。 |