- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ES6新特性:JavaScript中的Reflect对象
Reflect介绍:Reflect这个对象在我的node(v4.4.3)中还没有实现, babel(6.7.7)也没有实现 ,新版本的chrome是支持的, ff比较早就支持Proxy和Reflect了,要让node支持Reflect可以安装/tvcutsem/harmony-reflect/%20harmony-reflect?;Reflect不是构造函数, 要使用的时候直接通过Reflect.method()调用, Reflect有的方法和Proxy差不多, 而且多数Reflect方法原生的Object已经重新实现了。什么要使用Reflect这里列举几个为什么要使用Reflect的原因, 译文地址:/tvcutsem/harmony-reflect/wikiReflect?, 大概翻译了一遍:1:更加有用的返回值:?Reflect有一些方法和ES5中Object方法一样样的, 比如: Reflect.getOwnPropertyDescriptor和Reflect.defineProperty, ?不过, Object.defineProperty(obj, name, desc)执行成功会返回obj, 以及其它原因导致的错误, Reflect.defineProperty只会返回false或者true来表示对象的属性是否设置上了, 如下代码可以重构:try { Object.defineProperty(obj, name, desc); // property defined successfully} catch (e) { // possible failure (and might accidentally catch the wrong exception)}重构成这样:if (Reflect.defineProperty(obj, name, desc)) { // success} else { // failure}其余的方法, 比如Relect.set , Reflect.deleteProperty, Reflect.preventExtensions, Reflect.setPrototypeOf, 都可以进行重构;2:函数操作,?如果要判断一个obj有定义或者继承了属性name, 在ES5中这样判断:name in obj?; 或者删除一个属性 :delete obj[name], ?虽然这些很好用, 很简短, 很明确, 但是要使用的时候也要封装成一个类;有了Reflect, 它帮你封装好了,?Reflect.has(obj, name), ?Reflect.deleteProperty(obj, name);3:更加可靠的函数式执行方式:?在ES中, 要执行一个函数f,并给它传一组参数args, 还要绑定this的话, 要这么写:f.apply(obj, args)但是f的apply可能被重新定义成用户自己的apply了,所以还是这样写比较靠谱:Ftotype.apply.call(f, obj, args)上面这段代码太长了, 而且不好懂, 有了Reflect, 我们可以更短更简洁明了:Reflect.apply(f, obj, args)4:可变参数形式的构造函数:?想象一下, 你想通过不确定长度的参数实例化一个构造函数, 在ES5中, 我们可以使用扩展符号, 可以这么写:var obj = new F(...args)不过在ES5中, 不支持扩展符啊, 所以, 我们只能用F.apply,或者F.call的方式传不同的参数, 可惜F是一个构造函数, 这个就坑爹了, 不过有了Reflect, 我们在ES5中能够这么写:var obj = Reflect.construct(F, args)5:控制访问器或者读取器的this:?在ES5中, 想要读取一个元素的属性或者设置属性要这样:var name = ... // get property name as a stringobj[name] // generic property lookupobj[name] = value // generic property updateReflect.get和Reflect.set方法允许我们做同样的事情, 而且他增加了一个额外的参数reciver, 允许我们设置对象的setter和getter的上下this:var name = ... // get property name as a stringReflect.get(obj, name, wrapper) // if obj[name] is an accessor, it gets run with `this === wrapper`R
文档评论(0)