28 反射

28.1 Reflect 对象

Reflect 对象:

  • %Reflect%
  • 全局对象"Reflect" 属性的初始值。
  • 普通对象
  • 具有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%
  • 不是函数对象
  • 没有 [[Construct]] 内部方法;不能与 new 运算符一起用作构造器。
  • 没有 [[Call]] 内部方法;不能作为函数调用。

28.1.1 Reflect.apply ( target, thisArg, args )

此函数在被调用时执行以下步骤:

  1. 如果 IsCallable(target) 是 false,则抛出 TypeError 异常。
  2. argList 为 ? CreateListFromArrayLike(args)。
  3. 执行 PrepareForTailCall()。
  4. 返回 ? Call(target, thisArg, argList)。

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

此函数在被调用时执行以下步骤:

  1. 如果 IsConstructor(target) 是 false,则抛出 TypeError 异常。
  2. 如果 newTarget 不存在,则将 newTarget 设置为 target
  3. 否则,如果 IsConstructor(newTarget) 是 false,则抛出 TypeError 异常。
  4. argList 为 ? CreateListFromArrayLike(args)。
  5. 返回 ? Construct(target, argList, newTarget)。

28.1.3 Reflect.defineProperty ( target, key, attrs )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. propertyKey 为 ? ToPropertyKey(key)。
  3. propertyDesc 为 ? ToPropertyDescriptor(attrs)。
  4. 返回 ? target.[[DefineOwnProperty]](propertyKey, propertyDesc)

28.1.4 Reflect.deleteProperty ( target, key )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. propertyKey 为 ? ToPropertyKey(key)。
  3. 返回 ? target.[[Delete]](propertyKey)

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

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. propertyKey 为 ? ToPropertyKey(key)。
  3. 如果 receiver 不存在,则
    1. receiver 设置为 target
  4. 返回 ? target.[[Get]](propertyKey, receiver)

28.1.6 Reflect.getOwnPropertyDescriptor ( target, key )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. propertyKey 为 ? ToPropertyKey(key)。
  3. propertyDesc 为 ? target.[[GetOwnProperty]](propertyKey)
  4. 返回 FromPropertyDescriptor(propertyDesc)。

28.1.7 Reflect.getPrototypeOf ( target )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. 返回 ? target.[[GetPrototypeOf]]()

28.1.8 Reflect.has ( target, key )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. propertyKey 为 ? ToPropertyKey(key)。
  3. 返回 ? target.[[HasProperty]](propertyKey)

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, key, value [ , receiver ] )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. propertyKey 为 ? ToPropertyKey(key)。
  3. 如果 receiver 不存在,则
    1. receiver 设置为 target
  4. 返回 ? target.[[Set]](propertyKey, value, receiver)

28.1.13 Reflect.setPrototypeOf ( target, proto )

此函数在被调用时执行以下步骤:

  1. 如果 target 不是 Object,则抛出 TypeError 异常。
  2. 如果 proto 不是 Object 且 proto 不是 null,则抛出 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 构造器:

  • 具有一个 [[Prototype]] 内部槽,其值为 %Function.prototype%
  • 没有 "prototype" 属性,因为 Proxy 对象没有需要初始化的 [[Prototype]] 内部槽。
  • 具有以下属性:

28.2.2.1 Proxy.revocable ( target, handler )

此函数创建一个可撤销的 Proxy 对象。

它在被调用时执行以下步骤:

  1. proxy 为 ? ProxyCreate(target, handler)。
  2. revokerClosure 为一个新的 Abstract Closure,它没有参数、不捕获任何内容,并在被调用时执行以下步骤:
    1. activeFunc活动函数对象
    2. revocableProxyactiveFunc.[[RevocableProxy]]
    3. 如果 revocableProxynull,则返回 NormalCompletion(undefined)。
    4. activeFunc.[[RevocableProxy]] 设为 null
    5. 断言:revocableProxy 是一个 Proxy 异质对象
    6. revocableProxy.[[ProxyTarget]] 设为 null
    7. revocableProxy.[[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 是一种 module namespace exotic object,它提供对模块导出绑定的运行时基于属性的访问。Module Namespace Object 没有构造函数。相反,对于每个被包含 NameSpaceImportImportDeclaration 导入的模块,都会创建一个这样的对象。

除了 10.4.6 中指定的属性外,每个 Module Namespace Object 还具有以下自有属性:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag% 属性的初始值是 String 值 "Module"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。