26 反射
译者目前在做前端,博客内容主要是文档翻译。如果读者希望我翻译某些和前端相关的文档,欢迎留言告诉我。对于已有在网络上能够搜到质量较高译文的文章,我就不做重复工作了。本人精力有限,翻译质量达不到出版书籍的程度,可能有些人看不懂,不过我相信这总会帮助到一些人。有空的时候我会返回来对之前的文章进行润色。
原文 http://www.ecma-international.org/ecma-262/7.0/index.html#sec-reflection
26.1 反射对象
反射对象是%Reflect%
固有对象并且是全局对象的Reflect属性的初始值。反射对象是普通对象(ordinary object)。
反射对象的[[Prototype]]
内部槽的值是%ObjectPrototype%
固有对象。
反射对象不是函数对象。它不具备[[Construct]]
内部方法,不可以把反射对象用作new
操作符的构造器。反射对象也不具备[[Call]]
内部方法,不可以将反射对象当作函数调用。
26.1.1 Reflect.apply ( target, thisArgument, argumentsList )
1.如果IsCallable(target)为false,抛出TypeError异常。
2.让args为 CreateListFromArrayLike(argumentsList)。
3.执行 PrepareForTailCall()。
4.返回 Call(target, thisArgument, args)。
26.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)。
26.1.3 Reflect.defineProperty ( target, propertyKey, attributes )
1.如果Type(target)不是Object,抛出TypeError异常。
2.让key为 ToPropertyKey(propertyKey)。
3.让desc为ToPropertyDescriptor(attributes)。
4.返回 target.[[DefineOwnProperty]](key, desc)。
26.1.4 Reflect.deleteProperty ( target, propertyKey )
1.如果Type(target)不是Object,抛出TypeError异常。
2.让key为ToPropertyKey(propertyKey)。
3.返回 target.[[Delete]](key)。
26.1.5 Reflect.get ( target, propertyKey [ , receiver ])
1.如果Type(target)不是Object,抛出TypeError错误。
2.让key为ToPropertyKey(propertyKey)。
3.如果没有参数receiver,那么
a.让receiver为target。
4.返回 target.[[Get]](key, receiver)。
26.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )
1.如果Type(target)不是Object,抛出TypeError异常。
2.让key为 ToPropertyKey(propertyKey)。
3.让desc为target.[[GetOwnProperty]](key)。
4.返回 FromPropertyDescriptor(desc)。
26.1.7 Reflect.getPrototypeOf ( target )
1.如果Type(target)不是Object,抛出TypeError异常。
2.返回 target.[[GetPrototypeOf]]()。
26.1.8 Reflect.has ( target, propertyKey )
1.如果Type(target)不是Object,抛出TypeError异常。
2.让key为ToPropertyKey(propertyKey)。
3.返回 target.[[HasProperty]](key)。
26.1.9 Reflect.isExtensible (target)
1.如果Type(target)不是Object,抛出TypeError异常。
2.返回 target.[[IsExtensible]]()。
26.1.10 Reflect.ownKeys ( target )
1.如果Type(target)不是Object,抛出TypeError异常。
2.让key为 target.[[OwnPropertyKeys]]()。
3.返回 CreateArrayFromList(keys)。
26.1.11 Reflect.preventExtensions ( target )
1.如果Type(target)不是Object,抛出TypeError异常。
2.返回 target.[[PreventExtensions]]()。
26.1.12 Reflect.set ( target, propertyKey, V [ , receiver ] )
1.如果Type(target)不是Object,抛出TypeError异常。
2.让key为 ToPropertyKey(propertyKey)。
3.如果没有参数receiver,那么
a.让receiver为target。
4.返回 target.[[Set]](key, V, receiver)。
26.1.13 Reflect.setPrototypeOf ( target, proto )
1.如果Type(target)不是Object,抛出TypeError异常。
2.如果Type(proto)不是Object并且proto不是null,抛出TypeError异常。
3.返回 target.[[SetPrototypeOf]](proto)。
26.2 代理对象
26.2.1 代理构造器
代理构造器是%Proxy%
固有对象并且是全局对象的Proxy
属性的初始值。当被当作构造器调用时,它创建并初始化一个新的代理外来对象(proxy exotic object)。Proxy
不应被作为一个函数调用,那样会抛出一个异常。
26.2.1.1 Proxy ( target, handler )
1.如果NewTarget是undefined,抛出TypeError异常。
2.返回 ProxyCreate(target, handler)。
26.2.2
Proxy
构造器内部槽[[Prototype]]
的值是固有对象 %FunctionPrototype%
。
Proxy
构造器没有prototype
属性因为代理外来对象没有需要初始化的[[Prototype]]
内部槽。
Proxy构造器具有下面的属性:
26.2.2.1 Proxy.revocable ( target, handler )
Proxy.revocable
函数被用来创建可撤销的代理对象。
1.让p为 ProxyCreate(target, handler)
2.让revoker被一个新的内建函数,它被定义在26.2.2.1.1。
3.设置revoker的[[RevocableProxy]]内部槽为p。
4.让result为 ObjectCreate(%ObjectPrototype%)。
5.执行 CreateDataProperty(result, "proxy", p)。
6.执行 CreateDataProperty(result, "revoke", revoker)。
7.返回 result。
26.2.2.1.1 代理可撤销函数
一个代理可撤销函数(Proxy revocation function)是一个匿名函数,它可以使一个特定的代理对象无效。
每一个代理可撤销函数具有一个[[RevocableProxy]]
内部槽。
当一个代理可撤销函数F被调用:
1.让F的[[RevocableProxy]]的内部槽的值为p。
2.如果p是null,返回undefined。
3.设置F的[[RevocableProxy]]内部槽的值为null。
4.断言:p是一个代理对象。
5.设置p的[[ProxyTarget]]内部槽为null。
6.设置p的[[ProxyHandler]]内部槽为null。
7.返回undefined。
代理可撤销函数的length
属性为0。
26.3 模块命名空间对象
一个模块命名空间对象(Module Namespace Object)是一个模块命名空间外来对象,提供运行时基于属性的对模块导出绑定的访问。模块命名空间对象没有构造器函数。反而,这样的对象被每一个具有 NameSpaceImport
的ImportDeclaration
导入(import)的模块所创建。
除了9.4.6中定义的属性,每个模块命名空间对象具有下面的自有属性:
26.3.1 @@toStringTag
@@toStringTag
属性的初始值是字符串Module
。
这个属性具有元属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }
。
26.3.2 [ @@iterator] ( )
1.让N为this值。
2.如果N不是一个模块命名空间外来对象,抛出TypeError异常。
3.让exports为N的[[Exports]]内部槽的值。
4.返回 CreateListIterator(exports)。
这个函数的name
属性值为 [Symbol.iterator]
。