ECMA-262 V7.0 中关于反射的描述

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.13.设置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)是一个模块命名空间外来对象,提供运行时基于属性的对模块导出绑定的访问。模块命名空间对象没有构造器函数。反而,这样的对象被每一个具有 NameSpaceImportImportDeclaration导入(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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值