Reflect

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

Reflect は、JavaScript 操作を受け付けるためのメソッドを提供する組み込みオブジェクトです。メソッドはプロキシーハンドラーのメソッドと同じです。Reflect は関数オブジェクトではありませんので、構築することはできません。

解説

他の多くのグローバルオブジェクトとは異なり、Reflect はコンストラクターではありません。new 演算子で使用したり、 Reflect オブジェクトを関数として呼び出したりすることはできません。 Reflect のすべてのプロパティとメソッドは (Math オブジェクトと同様に) 静的です。

Reflect オブジェクトはプロキシーハンドラーのメソッドと同じ名前をもつ、下記の関数を提供します。

これらのメソッドの一部は Object の対応するメソッドとも同じですが、これらの間にはいくらか微妙な違いがあります。

静的メソッド

Reflect.apply(target, thisArgument, argumentsList)

target 関数を、引数 argumentsList で指定された引数で呼び出します。 Function.prototype.apply() も参照してください。

Reflect.construct(target, argumentsList[, newTarget])

関数としての new 演算子です。 new target(...argumentsList) を呼び出すのと等価です。別なプロトタイプを指定するためにオプションを指定することもできます。

Reflect.defineProperty(target, propertyKey, attributes)

Object.defineProperty() と同様です。返値は論理値で、プロパティが定義できた場合は true を返します。

Reflect.deleteProperty(target, propertyKey)

関数としての delete 演算子です。 delete target[propertyKey] を呼び出すのと等価です。

Reflect.get(target, propertyKey[, receiver])

このプロパティの値を返します。オブジェクトからのプロパティの取得 (target[propertyKey]) を関数にしたようなものです。

Reflect.getOwnPropertyDescriptor(target, propertyKey)

Object.getOwnPropertyDescriptor() に似ています。指定したプロパティが存在する場合にプロパティ記述子を返し、存在しない場合は undefined を返します。

Reflect.getPrototypeOf(target)

Object.getPrototypeOf() と同じです。

Reflect.has(target, propertyKey)

論理値で、対象がそのプロパティを持っているかどうかを返します。固有の場合も継承の場合も含みます。 in 演算子を関数にしたものです。

Reflect.isExtensible(target)

Object.isExtensible() と同じです。論理値を返し、 true ならば対象が拡張可能です。

Reflect.ownKeys(target)

独自の (継承されているものではない) プロパティのキーをもつ文字列の配列を返します。

Reflect.preventExtensions(target)

Object.preventExtensions() に似ています。論理値を返し、 true は更新に成功した場合です。

Reflect.set(target, propertyKey, value[, receiver])

値をプロパティに割り当てる関数です。更新に成功したら true となる論理値を返します。

Reflect.setPrototypeOf(target, prototype)

オブジェクトのプロトタイプを設定する関数です。論理値を返し、 true ならば成功です。

オブジェクトが特定のプロパティを持っているかどうかを検出

js
const duck = {
  name: "Maurice",
  color: "white",
  greeting: function () {
    console.log(`Quaaaack! My name is ${this.name}`);
  },
};

Reflect.has(duck, "color");
// true
Reflect.has(duck, "haircut");
// false

オブジェクトが所有するキーの返却

js
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]

オブジェクトへの新しいプロパティの追加

js
Reflect.set(duck, "eyes", "black");
// 成功した場合は "true" を返します。
// "duck" には "eyes: 'black'" プロパティが設定されました。

仕様書

Specification
ECMAScript Language Specification
# sec-reflect-object

ブラウザーの互換性

BCD tables only load in the browser

関連情報

  • Proxy グローバルオブジェクト
  • handler オブジェクト