Reflect
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年9月.
Reflect 名前空間オブジェクトには、介入可能な JavaScript オブジェクトの内部メソッドを呼び出すための静的メソッドが含まれています。これらのメソッドは、プロキシハンドラーのものと同一です。
解説
他の多くのグローバルオブジェクトとは異なり、Reflect はコンストラクターではありません。new 演算子で使用したり、 Reflect オブジェクトを関数として呼び出したりすることはできません。 Reflect のすべてのプロパティとメソッドは(Math オブジェクトと同様に)静的です。
Reflect オブジェクトはプロキシーハンドラーのメソッドと同じ名前をもつ静的関数群を提供しています。
Reflectの主な用途は、Proxyハンドラーのトラップにおいてデフォルトの転送動作を提供することです。プロキシーは、オブジェクトに対する操作に介入するために使用されます。これは、オブジェクト内部メソッドに対する独自の実装を提供します。Reflect API は、対応する内部メソッドを呼び出すために使用されます。例えば、下記コードはプロキシー p を生成し、これが持つ deleteProperty トラップが、[[Delete]] 内部メソッドに介入します。Reflect.deleteProperty() はデフォルトの [[Delete]] 動作を targetObject に対して直接呼び出すために使用されます。これは delete で置き換えられますが、Reflect を使用すれば、それぞれの内部メソッドに対応する構文を覚える必要がなくなります。
const p = new Proxy(
{},
{
deleteProperty(targetObject, property) {
// 独自機能: 削除のログ
console.log("プロパティを削除:", property);
// 介入先のデフォルトの動作を実行
return Reflect.deleteProperty(targetObject, property);
},
},
);
Reflect メソッドは、内部メソッドを呼び出す方法をより細かく制御することができます。例えば、Reflect.construct() は、特定の new.target 値を持つターゲット関数を構築する唯一の方法です。関数を呼び出す際に new 演算子を使用した場合、new.target の値は常にその関数自体になります。これはサブクラス化において重要な効果を及ぼします。例えば、Reflect.get() を使用すると、ゲッターを独自の this 値で実行できます。一方、プロパティアクセサーは常に現在のオブジェクトを this 値として使用します。
ほぼすべての Reflect メソッドの動作は、それ以外にも他の構文やメソッドで実現可能です。これらのメソッドの一部には、Object 上に同名の対応する静的メソッドが存在しますが、微妙な違いがあります。正確な差異については、それぞれの Reflect メソッドの説明を参照してください。
静的プロパティ
Reflect[Symbol.toStringTag]-
[Symbol.toStringTag]プロパティの初期値は文字列"Reflect"です。このプロパティはObject.prototype.toString()で使用されます。
静的メソッド
Reflect.apply()-
target関数を、引数argumentsListで指定された引数で呼び出します。Function.prototype.apply()も参照してください。 Reflect.construct()-
関数としての
new演算子です。new target(...argumentsList)を呼び出すのと等価です。別なプロトタイプを指定するためにオプションを指定することもできます。 Reflect.defineProperty()-
Object.defineProperty()と同様です。返値は論理値で、プロパティが定義できた場合はtrueを返します。 Reflect.deleteProperty()-
関数としての
delete演算子です。delete target[propertyKey]を呼び出すのと等価です。 Reflect.get()-
このプロパティの値を返します。オブジェクトからのプロパティの取得 (
target[propertyKey]) を関数にしたようなものです。 Reflect.getOwnPropertyDescriptor()-
Object.getOwnPropertyDescriptor()に似ています。指定したプロパティが存在する場合にプロパティ記述子を返し、存在しない場合はundefinedを返します。 Reflect.getPrototypeOf()-
Object.getPrototypeOf()と同じです。 Reflect.has()-
論理値で、対象がそのプロパティを持っているかどうかを返します。固有の場合も継承の場合も含みます。
in演算子を関数にしたものです。 Reflect.isExtensible()-
Object.isExtensible()と同じです。論理値を返し、trueならば対象が拡張可能です。 Reflect.ownKeys()-
独自の (継承されているものではない) プロパティのキーをもつ文字列の配列を返します。
Reflect.preventExtensions()-
Object.preventExtensions()に似ています。論理値を返し、trueは更新に成功した場合です。 Reflect.set()-
値をプロパティに割り当てる関数です。更新に成功したら
trueとなる論理値を返します。 Reflect.setPrototypeOf()-
オブジェクトのプロトタイプを設定する関数です。論理値を返し、
trueならば成功です。
例
>オブジェクトが特定のプロパティを持っているかどうかを検出
const duck = {
name: "Maurice",
color: "white",
greeting() {
console.log(`Quaaaack! My name is ${this.name}`);
},
};
Reflect.has(duck, "color");
// true
Reflect.has(duck, "haircut");
// false
オブジェクトが所有するキーの返却
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]
オブジェクトへの新しいプロパティの追加
Reflect.set(duck, "eyes", "black");
// 成功した場合は "true" を返します。
// "duck" には "eyes: 'black'" プロパティが設定されました。
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-reflect-object> |