摘要:对象的设计目的有几个。现阶段,某些方法同时在喝对象上部署,未来的新方法将只部署在对象上。修改某些方法的返回结果,让其变得更合理。它采用方法将值赋值给对象的属性,确保完成原有的行为,然后再部署额外的功能。
Reflect
概述。
Relflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新的API。Reflect对象的设计目的有几个。
(1)将Object对象的一些明显属于语言内部的方法(比如Obejcet.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object喝Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从reflect对象上可以拿到语言内部的方法。
(2)修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj,name,desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj,name,desc)则会返回false。
//老写法 try{ Object.defineProperty(target,property,attributes); //success }catch(e){ //failure } //新写法 if(Reflect.defineProperty(target,property,attributes)){ //success }else{ //failure }
(3)让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj,name)和Reflect.deleteProperty(obj,name)让它们变成了函数行为。
//老写法 "assign" in Object//true //新写法 Reflect.has(Object,"assign")//true
(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。
Proxy(target, { set: function(target, name, value, receiver) { var success = Reflect.set(target,name, value, receiver); if (success) { console.log("property " + name + " on " + target + " set to " + value); } return success; } });
上面代码中,Proxy方法拦截target对象的属性赋值行为。它采用Reflect.set方法将值赋值给对象的属性,确保完成原有的行为,然后再部署额外的功能。
下面是另一个例子。
var loggedObj = new Proxy(obj, { get(target, name) { console.log("get", target, name); return Reflect.get(target, name); }, deleteProperty(target, name) { console.log("delete" + name); return Reflect.deleteProperty(target, name); }, has(target, name) { console.log("has" + name); return Reflect.has(target, name); } });
上面代码中,每一个Proxy对象的拦截操作(getdeletehas),内部都调用对应的Reflect方法,保证原生行为能够正常执行。添加的工作,就是将每一个操作输出一行日志。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/101708.html
摘要:出现的目的把对象中的一些明显属于语言内部的方法,放到对象上,比如。修改某些方法的返回结果,让其变得合理。在无法定义属性时,会抛出一个错误,而则会返回让操作变成函数行为。某些操作时命令式的比如和,而和让他们变成函数行为。 Reflect出现的目的 1.把Object对象中的一些明显属于语言内部的方法,放到Reflect对象上,比如Object.defineProperty。就是说可以把R...
摘要:概述反射说起来和上一章节的代理基本一样,只是使用的方式不同,设计理念也不同。 0x000 概述 反射说起来和上一章节的代理基本一样,只是使用的方式不同,设计理念也不同。 反射提供了一系列的静态函数,可以使用Reflect.function_name(...prams)调用,这一系列的方法和代理的处理器对象方法一致 0x001 apply 语法 Reflect.apply(targ...
摘要:是中新增的特性。首先来说,的提出是为了整合之前中存在的一些不太合理的地方。表示当前对象是否可扩展,返回一个布尔值。更完美的枚举很多代码使用字符串普通或冻结的对象作为枚举。通过记录这些访问和修改信息,能记录下对这个对象的所有操作记录。 Reflect Reflect 是ES6中新增的特性。它是一个普通对象,下面有13个静态方法(enumerate在最终的发布版中被移除),可以再全局下访问...
摘要:拦截实例作为构造函数调用的操作,比如。方法等同于,这提供了一种不使用,来调用构造函数的方法。方法对应,返回一个布尔值,表示当前对象是否可扩展。这是的一个提案,目前转码器已经支持。别名或修饰器在控制台显示一条警告,表示该方法将废除。 Proxy Proxy 这个词的原意是代理,用在这里表示由它来代理某些操作,可以译为代理器,即用自己的定义覆盖了语言的原始定义。ES6 原生提供 Proxy...
摘要:查找并返回对象的属性例例属性部署了读取函数返回的是的参数对象注意如果的第一个参数不是对象,则会报错。它返回一个布尔值,表示是否操作成功用于返回对象的所有属性使用和实现观察者模式请参考观察者模式 1、什么是Reflect?为操作对象而提供的新API 2、为什么要设计Reflect?(1)将Object对象的属于语言内部的方法放到Reflect对象上,即从Reflect对象上拿Object...
阅读 2026·2021-11-08 13:14
阅读 2934·2021-10-18 13:34
阅读 2021·2021-09-23 11:21
阅读 3581·2019-08-30 15:54
阅读 1751·2019-08-30 15:54
阅读 2918·2019-08-29 15:33
阅读 2568·2019-08-29 14:01
阅读 1940·2019-08-29 13:52