Proxy and Reflect
Proxy はオブジェクトの基本操作(プロパティアクセス、代入、関数呼び出し等)をトラップで傍受・カスタマイズできます。Reflect は対応する標準メソッドを提供します。
概要
Proxy はオブジェクトの基本操作(プロパティアクセス、代入、関数呼び出し等)をトラップで傍受・カスタマイズできます。Reflect は対応する標準メソッドを提供します。
対応ブラウザ
| 機能 | デスクトップ | モバイル | ||||
|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Safari iOS | |
| 49 | 12 | 18 | 10 | 49 | 10 | |
| Proxy() コンストラクターは Proxy オブジェクトを生成します。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.apply() メソッドは、オブジェクトの [[Call]] 内部メソッドに対するトラップです。関数呼び出しなどの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.construct() メソッドは、オブジェクトの [[Construct]] 内部メソッドに対するトラップです。Operators/new 演算子などの操作で使用されます。結果としてのプロキシーオブジェクトが new 演算子を使用できるようにするためには、プロキシーを初期化するために使用されるターゲット自体が有効なコンストラクターである必要があります。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.defineProperty() は、オブジェクトの [[DefineOwnProperty]] 内部メソッドに対するトラップです。Object.defineProperty() などの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.deleteProperty() メソッドは、オブジェクトの [[Delete]] 内部メソッドに対するトラップです。 Operators/delete などの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.get() は、オブジェクトの [[Get]] 内部メソッドに対するトラップです。プロパティアクセサーなどの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.getOwnPropertyDescriptor() は、オブジェクトの [[GetOwnProperty]] 内部メソッドに対するトラップです。Object.getOwnPropertyDescriptor() などの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.getPrototypeOf() メソッドは、オブジェクトの [[GetPrototypeOf]] 内部メソッドに対するトラップです。Object.getPrototypeOf() などの操作で使用されます。 | 49 | 79 | 49 | 10 | 49 | 10 |
| handler.has() は、オブジェクトの [[HasProperty]] 内部メソッドに対するトラップです。Operators/in 演算子などの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.isExtensible() は、オブジェクトの [[IsExtensible]] 内部メソッドに対するトラップです。Object.isExtensible() などの操作で使用されます。 | 49 | 12 | 31 | 10 | 49 | 10 |
| handler.ownKeys() メソッドは、オブジェクトの [[OwnPropertyKeys]] 内部メソッドに対するトラップです。 Object.keys(), Reflect.ownKeys() などの操作で使用されます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.preventExtensions() はメソッドは、オブジェクトの [[PreventExtensions]] 内部メソッドに対するトラップです。 Object.preventExtensions() のような操作で使用されます。 | 49 | 12 | 22 | 10 | 49 | 10 |
| handler.set() メソッドは、オブジェクトの [[Set]] 内部メソッドに対するトラップであり、プロパティアクセサーを使用してプロパティの値を設定する操作に使われます。 | 49 | 12 | 18 | 10 | 49 | 10 |
| handler.setPrototypeOf() メソッドは、オブジェクトの [[SetPrototypeOf]] 内部メソッドに対するトラップです。 Object.setPrototypeOf() などの操作で使用されます。 | 49 | 12 | 49 | 10 | 49 | 10 |
| Proxy.revocable() メソッドは、取り消し可能な Proxy オブジェクトを作成するために使用します。 | 63 | 12 | 34 | 10 | 63 | 10 |
| その他 | ||||||
| Reflect 名前空間オブジェクトには、介入可能な JavaScript オブジェクトの内部メソッドを呼び出すための静的メソッドが含まれています。これらのメソッドは、プロキシハンドラーのものと同一です。 | 49 | 12 | 42 | 10 | 49 | 10 |
| ビルトインオブジェクト | ||||||
| Reflect.apply() は静的メソッドで、指定された引数とともに対象となる関数を呼び出します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.construct() は静的メソッドで、Operators/new 演算子のように、ただし関数として動作します。これは new target(...args) の呼び出しと同等です。さらに、別の new.target 値を指定することもすることができます。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.defineProperty() は静的メソッドで、Object.defineProperty() と似ていますが、論理値 (Boolean) を返します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.deleteProperty() は静的メソッドで、Operators/delete 演算子と同様に実装されていますが、関数として動作します。オブジェクトからプロパティを削除します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.get() は静的メソッドで、プロパティアクセサー構文と同様に実装されていますが、関数として存在します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.getOwnPropertyDescriptor() は静的メソッドで、Object.getOwnPropertyDescriptor() と似ています。オブジェクトに指定されたプロパティが存在する場合、そのプロパティ記述子を返します。存在しない場合は undefined を返します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.getPrototypeOf() は静的メソッドで、Object.getPrototypeOf() とほぼ同じメソッドです。これは指定したオブジェクトのプロトタイプを返します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.has() は静的メソッドで、in 演算子と似ていますが、関数として存在します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.isExtensible() は静的メソッドで、これは Object.isExtensible() に似ています。これはオブジェクトが拡張可能であるか(オブジェクトに追加された新しいプロパティを持てるかどうか)を判断します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.ownKeys() は静的メソッドで、target オブジェクトが持つプロパティキーの配列を返します。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.preventExtensions() は静的メソッドで、Object.preventExtensions() に似ています。すでにプロパティが追加されたオブジェクトに、新しいプロパティを抑制します (つまり、オブジェクトのさらなる拡張を抑制します)。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.set() は静的メソッドで、プロパティアクセサーおよび代入構文に似ていますが、関数として実装されています。 | 49 | 12 | 42 | 10 | 49 | 10 |
| Reflect.setPrototypeOf() は静的メソッドで、Object.setPrototypeOf() と同様ですが、論理値 (Boolean) を返す点が異なります。指定されたオブジェクトのプロトタイプ(すなわち内部の [[Prototype]] プロパティ)を設定します。 | 49 | 12 | 42 | 10 | 49 | 10 |
- Firefox 42 では、最終的な ES2015 仕様を反映するために実装が更新されました:結果が配列であるかどうか、配列要素が文字列型かシンボル型であるかどうかがチェックされるようになりました。重複する自身のプロパティ名を列挙しても失敗しなくなりました。
基本構文
const handler = {
get(target, prop) {
return prop in target ? target[prop] : `${prop} is undefined`;
},
set(target, prop, value) {
if (typeof value !== 'number') throw TypeError('Only numbers allowed');
target[prop] = value;
return true;
}
};
const obj = new Proxy({}, handler);
obj.x = 42; // OK
obj.missing; // 'missing is undefined' ライブデモ
実務での使いどころ
-
Proxy and Reflect の活用
オブジェクトの操作をインターセプトする Proxy と、オブジェクト操作の標準メソッドを提供する Reflect。
注意点
- 特になし。すべての主要ブラウザで安定して動作する。
アクセシビリティ
- JavaScript による動的更新時は、aria-live リージョンで変更をスクリーンリーダーに通知する。
参考リンク
Powered by web-features