28 リフレクション (Reflection)

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

Reflect オブジェクト:

  • %Reflect% である。
  • グローバルオブジェクト"Reflect" プロパティの初期値である。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Object.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, V [ , receiver ] )

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

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. もし receiver が存在しなければ
    1. receivertarget に設定する。
  4. target.[[Set]](key, V, 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% プロパティの初期値は文字列値 "Reflect" である。

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

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

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

Proxy コンストラクタ:

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

28.2.1.1 Proxy ( target, handler )

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

  1. もし NewTarget が undefined なら TypeError 例外を投げる。
  2. ProxyCreate(target, handler) を返す。

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

Proxy コンストラクタ:

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

28.2.2.1 Proxy.revocable ( target, handler )

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

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

  1. proxy を ? ProxyCreate(target, handler) とする。
  2. revokerClosure を、引数無しで何も捕捉せず呼び出されると次を行う新たな Abstract Closure とする:
    1. F をアクティブな関数オブジェクトとする。
    2. pF.[[RevocableProxy]] とする。
    3. もし pnull なら NormalCompletion(undefined) を返す。
    4. F.[[RevocableProxy]]null に設定する。
    5. 事前条件: pProxy エキゾチックオブジェクトである。
    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 Objects)

モジュール名前空間オブジェクトはモジュールのエクスポート束縛へ実行時のプロパティベースアクセスを提供する module namespace エキゾチックオブジェクトである。Module Namespace Objects 用のコンストラクタ関数は存在しない。代わりに、このようなオブジェクトは NameSpaceImport を含む ImportDeclaration によりインポートされた各モジュールごとに生成される。

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

28.3.1 %Symbol.toStringTag%

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

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