28 リフレクション

28.1 Reflect オブジェクト

Reflect オブジェクト:

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

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 が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. desc を ? ToPropertyDescriptor(attributes) とする。
  4. target.[[DefineOwnProperty]](key, desc) を返す。

28.1.4 Reflect.deleteProperty ( target, propertyKey )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. target.[[Delete]](key) を返す。

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

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

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

28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. desc を ? target.[[GetOwnProperty]](key) とする。
  4. FromPropertyDescriptor(desc) を返す。

28.1.7 Reflect.getPrototypeOf ( target )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. target.[[GetPrototypeOf]]() を返す。

28.1.8 Reflect.has ( target, propertyKey )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. target.[[HasProperty]](key) を返す。

28.1.9 Reflect.isExtensible ( target )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. target.[[IsExtensible]]() を返す。

28.1.10 Reflect.ownKeys ( target )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. keys を ? target.[[OwnPropertyKeys]]() とする。
  3. CreateArrayFromList(keys) を返す。

28.1.11 Reflect.preventExtensions ( target )

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

  1. target が Object でなければ、TypeError 例外を投げる。
  2. target.[[PreventExtensions]]() を返す。

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

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

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

28.1.13 Reflect.setPrototypeOf ( target, proto )

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

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

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "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 )

この関数は、revocable Proxy オブジェクトを作成する。

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

  1. proxy を ? ProxyCreate(target, handler) とする。
  2. revokerClosure を、何もキャプチャせず、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. activeFunc をアクティブな関数オブジェクトとする。
    2. pactiveFunc.[[RevocableProxy]] とする。
    3. pnull であれば、NormalCompletion(undefined) を返す。
    4. activeFunc.[[RevocableProxy]]null に設定する。
    5. Assert: p は Proxy exotic object である。
    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 Module Namespace オブジェクト

Module Namespace Object は、モジュールの exported binding への実行時のプロパティベースのアクセスを提供する module namespace exotic object である。Module Namespace Object 用のコンストラクター関数は存在しない。代わりに、そのようなオブジェクトは、NameSpaceImport を含む ImportDeclaration によってインポートされる各モジュールについて作成される。

10.4.6 で指定されるプロパティに加えて、各 Module Namespace Object は次の own プロパティを持つ:

28.3.1 %Symbol.toStringTag%

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

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