このページはECMAScript® 2020 Language Specification26 Reflection章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

26.1 Reflectオブジェクト(The Reflect Object)

Reflectオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%Reflect%です。
  • グローバルオブジェクト"Reflect"プロパティの初期値です。
  • 通常のオブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • 関数オブジェクトではありません。
  • [[Construct]]内部メソッドはありません。 new演算子のコンストラクターとして使用することはできません。
  • [[Call]]内部メソッドはありません。 関数として呼び出すことはできません。

26.1.1 Reflect.apply ( target, thisArgument, argumentsList )

apply関数が引数targetthisArgumentargumentsListを指定して呼び出されると、次の手順が実行されます。

  1. IsCallable(target) が false なら、TypeError例外をスローする
  2. ? CreateListFromArrayLike(argumentsList) を args とする
  3. PrepareForTailCall() を実行する
  4. ? Call(target, thisArgument, args) を返す

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

construct関数が引数targetargumentsListnewTargetを使用して呼び出されると、次の手順が実行されます。

  1. IsConstructor(target) が false なら、TypeError例外をスローする
  2. newTarget が 存在しないなら、 targetnewTarget にセットする
  3. 2. と異なり、 IsConstructor(newTarget) が false なら TypeError例外をスローする
  4. ? CreateListFromArrayLike(argumentsList) を args とする
  5. ? Construct(target, args, newTarget) を返す

26.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

defineProperty 関数が引数 targetpropertyKeyattributes で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? ToPropertyKey(propertyKey) を key とする
  3. ? ToPropertyDescriptor(attributes) を desc とする
  4. ? target.[[DefineOwnProperty]](key, desc) を返す

26.1.4 Reflect.deleteProperty ( target, propertyKey )

deleteProperty 関数が引数 targetpropertyKey で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? ToPropertyKey(propertyKey) を key とする
  3. ? target.[[Delete]](key) を返す

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

get 関数が引数 targetpropertyKeyreceiver で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? ToPropertyKey(propertyKey) を key とする
  3. receiver が 存在しないなら、
    1. targetreceiver にセットする
  4. ? target.[[Get]](key, receiver) を返す

26.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

getOwnPropertyDescriptor 関数が引数 targetpropertyKey で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? ToPropertyKey(propertyKey) を key とする
  3. ? target.[[GetOwnProperty]](key) を desc とする
  4. FromPropertyDescriptor(desc) を返す

26.1.7 Reflect.getPrototypeOf ( target )

the getPrototypeOf function が引数 target で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? target.[[GetPrototypeOf]]() を返す

26.1.8 Reflect.has ( target, propertyKey )

has 関数が引数 targetpropertyKey で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? ToPropertyKey(propertyKey) を key とする
  3. ? target.[[HasProperty]](key) を返す

26.1.9 Reflect.isExtensible ( target )

isExtensible 関数が引数 target で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? target.[[IsExtensible]]() を返す

26.1.10 Reflect.ownKeys ( target )

ownKeys 関数が引数 target で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? target.[[OwnPropertyKeys]]() を keys とする
  3. CreateArrayFromList(keys) を返す

26.1.11 Reflect.preventExtensions ( target )

preventExtensions 関数が引数 target で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? target.[[PreventExtensions]]() を返す

26.1.12 Reflect.set ( target, propertyKey, V [ , receiver ] )

set 関数が引数 targetVpropertyKeyreceiver で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? ToPropertyKey(propertyKey) を key とする
  3. receiver が 存在しないなら、
    1. targetreceiver にセットする
  4. ? target.[[Set]](key, V, receiver) を返す

26.1.13 Reflect.setPrototypeOf ( target, proto )

setPrototypeOf 関数が引数 targetproto で呼び出されると、次の手順が実行されます。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. Type(proto) が not Object and proto is not null なら、TypeError例外をスローする
  3. ? target.[[SetPrototypeOf]](proto) を返す

26.2 Proxyオブジェクト(Proxy Objects)

26.2.1 Proxyコンストラクター(The Proxy Constructor)

Proxyコンストラクターは、次の特徴があります。

26.2.1.1 Proxy ( target, handler )

Proxyが引数targetおよびhandlerを使用して呼び出されると、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? ProxyCreate(target, handler) を返す

26.2.2 Proxyコンストラクタのプロパティ(Properties of the Proxy Constructor)

Proxyコンストラクターは、次の特徴があります。

26.2.2.1 Proxy.revocable ( target, handler )

Proxy.revocable関数は、取り消し可能なProxyオブジェクトを作成するために使用されます。 Proxy.revocableが引数targetおよびhandlerを使用して呼び出されると、次の手順が実行されます。

  1. ? ProxyCreate(target, handler) を p とする
  2. Proxy Revocation関数 のアルゴリズムステップを steps とする
  3. ! CreateBuiltinFunction(steps, « [[RevocableProxy]] ») を revoker とする
  4. prevoker.[[RevocableProxy]] にセットする
  5. OrdinaryObjectCreate(%Object.prototype%) を result とする
  6. ! CreateDataPropertyOrThrow(result, "proxy", p) を実行する
  7. ! CreateDataPropertyOrThrow(result, "revoke", revoker) を実行する
  8. result を返す
26.2.2.1.1 Proxy Revocation関数(Functions)

Proxy Revocation関数は、特定のプロキシオブジェクトを無効にする機能を持つ匿名の組み込み関数です。

この関数には、[[RevocableProxy]]内部スロットがあります。

この関数が呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. F.[[RevocableProxy]] を p とする
  3. pnull なら、 undefined を返す
  4. nullF.[[RevocableProxy]] にセットする
  5. Assert: p は Proxyオブジェクト
  6. nullp.[[ProxyTarget]] にセットする
  7. nullp.[[ProxyHandler]] にセットする
  8. undefined を返す

この関の "length" プロパティは 0 です。

26.3 モジュールネームスペースオブジェクト(Module Namespace Objects)

モジュールネームスペースオブジェクトは、モジュールからエクスポートされたバインディングへのランタイムプロパティベースアクセスを提供するモジュールネームスペースエキゾチックオブジェクトです。このオブジェクトにコンストラクター関数はありません。代わりに、NameSpaceImportを含むImportDeclarationによってインポートされるモジュールごとに作成されます。

9.4.6で指定されたプロパティに加えて、このオブジェクトには以下の独自プロパティがあります。

26.3.1 @@toStringTag

@@toStringTagプロパティの初期値は、文字列値"Module"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。