28 反射

28.1 Reflect 对象

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 不存在,将 newTarget 设为 target
  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. receiver 设为 target
  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. receiver 设为 target
  4. 返回 ? target.[[Set]](key, 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% 属性的初始值是字符串值 "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. pactiveFunc.[[RevocableProxy]]
    3. 如果 pnull,返回 NormalCompletion(undefined)。
    4. activeFunc.[[RevocableProxy]] 设为 null
    5. 断言: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 模块命名空间对象

模块命名空间对象是一种模块命名空间异质对象,它提供对模块导出绑定的基于属性的运行时访问。模块命名空间对象没有构造器函数。相反,对于每个由包含 NameSpaceImportImportDeclaration 导入的模块,都会创建这样的一个对象。

除了 10.4.6 中指定的属性之外,每个模块命名空间对象还具有以下自有属性:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag% 属性的初始值是字符串值 "Module"

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