28 Reflection

28.1 Reflectオブジェクト

Reflect objectは:

  • %Reflect%である。
  • global object"Reflect" propertyのinitial valueである。
  • ordinary objectである。
  • valueが%Object.prototype%である[[Prototype]] internal slotを持つ。
  • function objectではない。
  • [[Construct]] internal methodを持たない;new operatorを伴ってconstructorとして使用できない。
  • [[Call]] internal methodを持たない;functionとしてinvokedできない。

28.1.1 Reflect.apply ( target, thisArg, args )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. IsCallable(target)がfalseなら、TypeError例外をthrowする。
  2. argListを ? CreateListFromArrayLike(args) とする。
  3. PrepareForTailCall()を実行する。
  4. Call(target, thisArg, argList)を返す。

28.1.2 Reflect.construct ( target, args [ , newTarget ] )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. IsConstructor(target)がfalseなら、TypeError例外をthrowする。
  2. newTargetが存在しないなら、newTargettargetに設定する。
  3. そうでなく、IsConstructor(newTarget)がfalseなら、TypeError例外をthrowする。
  4. argListを ? CreateListFromArrayLike(args) とする。
  5. Construct(target, argList, newTarget)を返す。

28.1.3 Reflect.defineProperty ( target, key, attrs )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. propertyKeyを ? ToPropertyKey(key) とする。
  3. propertyDescを ? ToPropertyDescriptor(attrs) とする。
  4. target.[[DefineOwnProperty]](propertyKey, propertyDesc)を返す。

28.1.4 Reflect.deleteProperty ( target, key )

このfunctionは、呼び出されたときに以下のstepsを実行する:

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

28.1.5 Reflect.get ( target, key [ , receiver ] )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. propertyKeyを ? ToPropertyKey(key) とする。
  3. receiverが存在しないなら、
    1. receivertargetに設定する。
  4. target.[[Get]](propertyKey, receiver)を返す。

28.1.6 Reflect.getOwnPropertyDescriptor ( target, key )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. propertyKeyを ? ToPropertyKey(key) とする。
  3. propertyDescを ? target.[[GetOwnProperty]](propertyKey) とする。
  4. FromPropertyDescriptor(propertyDesc)を返す。

28.1.7 Reflect.getPrototypeOf ( target )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. target.[[GetPrototypeOf]]()を返す。

28.1.8 Reflect.has ( target, key )

このfunctionは、呼び出されたときに以下のstepsを実行する:

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

28.1.9 Reflect.isExtensible ( target )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. target.[[IsExtensible]]()を返す。

28.1.10 Reflect.ownKeys ( target )

このfunctionは、呼び出されたときに以下のstepsを実行する:

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

28.1.11 Reflect.preventExtensions ( target )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. target.[[PreventExtensions]]()を返す。

28.1.12 Reflect.set ( target, key, value [ , receiver ] )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. propertyKeyを ? ToPropertyKey(key) とする。
  3. receiverが存在しないなら、
    1. receivertargetに設定する。
  4. target.[[Set]](propertyKey, value, receiver)を返す。

28.1.13 Reflect.setPrototypeOf ( target, proto )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. targetがObjectでないなら、TypeError例外をthrowする。
  2. protoがObjectでなく、かつprotonullでないなら、TypeError例外をthrowする。
  3. target.[[SetPrototypeOf]](proto)を返す。

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "Reflect"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

28.2 Proxyオブジェクト

28.2.1 Proxyコンストラクタ

Proxy constructorは:

  • %Proxy%である。
  • global object"Proxy" propertyのinitial valueである。
  • constructorとして呼び出されたときにnew Proxy objectをcreateしてinitializeする。
  • functionとして呼び出されることを意図しておらず、そのように呼び出された場合はexceptionをthrowする。

28.2.1.1 Proxy ( target, handler )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. NewTargetがundefinedなら、TypeError例外をthrowする。
  2. ProxyCreate(target, handler)を返す。

28.2.2 Proxyコンストラクタのプロパティ

Proxy constructorは:

  • valueが%Function.prototype%である[[Prototype]] internal slotを持つ。
  • Proxy objectsはinitializationを必要とする[[Prototype]] internal slotを持たないため、"prototype" propertyを持たない。
  • 以下のpropertiesを持つ:

28.2.2.1 Proxy.revocable ( target, handler )

このfunctionはrevocable Proxy objectを作成する。

これは、呼び出されたときに以下のstepsを実行する:

  1. ProxyCreate(target, handler)をproxyとする。
  2. パラメータを持たず、何も捕捉せず、呼び出されたときに次のステップを実行する新しいAbstract ClosurerevokerClosureとする。
    1. アクティブな関数オブジェクトをactiveFuncとする。
    2. activeFunc.[[RevocableProxy]]revocableProxyとする。
    3. revocableProxynullである場合、NormalCompletion(undefined)を返す。
    4. activeFunc.[[RevocableProxy]]nullに設定する。
    5. Assert: revocableProxyProxy exotic objectである。
    6. revocableProxy.[[ProxyTarget]]nullに設定する。
    7. revocableProxy.[[ProxyHandler]]nullに設定する。
    8. NormalCompletion(undefined)を返す。
  3. CreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] »)をrevokerとする。
  4. revoker.[[RevocableProxy]]proxyに設定する。
  5. OrdinaryObjectCreate(%Object.prototype%)をresultとする。
  6. CreateDataPropertyOrThrow(result, "proxy", proxy)を実行する。
  7. CreateDataPropertyOrThrow(result, "revoke", revoker)を実行する。
  8. resultを返す。

28.3 Module Namespaceオブジェクト

Module Namespace Objectは、moduleのexported bindingsへのruntime property-based accessを提供するmodule namespace exotic objectである。Module Namespace Objectsにはconstructor functionは存在しない。代わりに、そのようなobjectは、NameSpaceImportを含むImportDeclarationによってimportされる各moduleについて作成される。

10.4.6でspecifiedされるpropertiesに加えて、各Module Namespace Objectは以下のown propertyを持つ:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag% propertyのinitial valueはString value "Module"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。