28 リフレクション

28.1 Reflectオブジェクト

Reflectオブジェクト:

28.1.1 Reflect.apply ( target, thisArgument, argumentsList )

この関数が呼び出されたとき、次の手順を実行する:

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

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

この関数が呼び出されたとき、次の手順を実行する:

  1. IsConstructor(target)がfalseなら、TypeError例外をスローする。
  2. newTargetが存在しない場合、newTargettargetを設定する。
  3. それ以外で、IsConstructor(newTarget)がfalseなら、TypeError例外をスローする。
  4. argsに? CreateListFromArrayLike(argumentsList)を設定する。
  5. ? Construct(target, args, newTarget)を返す。

28.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keyに? ToPropertyKey(propertyKey)を設定する。
  3. descに? ToPropertyDescriptor(attributes)を設定する。
  4. target.[[DefineOwnProperty]](key, desc)を返す。

28.1.4 Reflect.deleteProperty ( target, propertyKey )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keyに? ToPropertyKey(propertyKey)を設定する。
  3. target.[[Delete]](key)を返す。

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

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keyに? ToPropertyKey(propertyKey)を設定する。
  3. receiverが存在しない場合、
    1. receivertargetを設定する。
  4. target.[[Get]](key, receiver)を返す。

28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keyに? ToPropertyKey(propertyKey)を設定する。
  3. descに? target.[[GetOwnProperty]](key)を設定する。
  4. FromPropertyDescriptor(desc)を返す。

28.1.7 Reflect.getPrototypeOf ( target )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. target.[[GetPrototypeOf]]()を返す。

28.1.8 Reflect.has ( target, propertyKey )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keyに? ToPropertyKey(propertyKey)を設定する。
  3. target.[[HasProperty]](key)を返す。

28.1.9 Reflect.isExtensible ( target )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. target.[[IsExtensible]]()を返す。

28.1.10 Reflect.ownKeys ( target )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keysに? target.[[OwnPropertyKeys]]()を設定する。
  3. CreateArrayFromList(keys)を返す。

28.1.11 Reflect.preventExtensions ( target )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. target.[[PreventExtensions]]()を返す。

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

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. keyに? ToPropertyKey(propertyKey)を設定する。
  3. receiverが存在しない場合、
    1. receivertargetを設定する。
  4. target.[[Set]](key, V, receiver)を返す。

28.1.13 Reflect.setPrototypeOf ( target, proto )

この関数が呼び出されたとき、次の手順を実行する:

  1. targetがオブジェクトでない場合、TypeError例外をスローする。
  2. protoがオブジェクトでもnullでもない場合、TypeError例外をスローする。
  3. target.[[SetPrototypeOf]](proto)を返す。

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値は文字列値"Reflect"である。

このプロパティは{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }の属性を持つ。

28.2 Proxyオブジェクト

28.2.1 Proxyコンストラクター

Proxyコンストラクター:

  • %Proxy%である。
  • グローバルオブジェクト"Proxy"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいProxyオブジェクトを生成・初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼ばれると例外をスローする。

28.2.1.1 Proxy ( target, handler )

この関数が呼び出されたとき、次の手順を実行する:

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

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

Proxyコンストラクター:

  • 値が%Function.prototype%である[[Prototype]]内部スロットを持つ。
  • Proxyオブジェクトは初期化すべき[[Prototype]]内部スロットを持たないため、"prototype"プロパティを持たない。
  • 次のプロパティを持つ:

28.2.2.1 Proxy.revocable ( target, handler )

この関数は取り消し可能なProxyオブジェクトを生成する。

呼び出されると次の手順を実行する:

  1. proxyに? ProxyCreate(target, handler)を設定する。
  2. 引数なし・何もキャプチャしない新しい抽象クロージャ_ revokerClosure を作成し、呼び出されたとき次の手順を実行する:
    1. Fにアクティブな関数オブジェクトを設定する。
    2. pF.[[RevocableProxy]]を設定する。
    3. pnullなら、NormalCompletion(undefined)を返す。
    4. F.[[RevocableProxy]]nullを設定する。
    5. アサート: pはProxyエキゾチックオブジェクトである。
    6. p.[[ProxyTarget]]nullを設定する。
    7. p.[[ProxyHandler]]nullを設定する。
    8. NormalCompletion(undefined)を返す。
  3. revokerCreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] »)を設定する。
  4. revoker.[[RevocableProxy]]proxyを設定する。
  5. resultOrdinaryObjectCreate(%Object.prototype%)を設定する。
  6. CreateDataPropertyOrThrow(result, "proxy", proxy)を実行する。
  7. CreateDataPropertyOrThrow(result, "revoke", revoker)を実行する。
  8. resultを返す。

28.3 モジュール名前空間オブジェクト

モジュール名前空間オブジェクトは、モジュールのエクスポートバインディングに実行時にプロパティベースでアクセスできるモジュール名前空間エキゾチックオブジェクトである。モジュール名前空間オブジェクト用のコンストラクター関数は存在しない。代わりに、NameSpaceImportを含むImportDeclarationでインポートされる各モジュールごとにそのようなオブジェクトが生成される。

10.4.6で規定されるプロパティに加えて、各モジュール名前空間オブジェクトは次の独自プロパティを持つ:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag%プロパティの初期値は文字列値"Module"である。

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