所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、内存中的大对象、文件或其它昂贵或无法复制的资源。著名的代理模式例子为引用计数(英语:reference counting)指针对象。
当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少内存用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
web前端开发学习Q-q-u-n: 784783012 ,分享开发工具,零基础,进阶视频教程,希望新手少走弯路
var backPhoneList = ['12345566'];//黑色单列表// 代理var ProxyAcceptPhone = function(phone){ console.log('电话正在接入...') if(backPhoneList.includes(phone)){ console.log('屏蔽黑名单电话') }else{ // 转接 AcceptPhone.call(this,phone) }}// 本体var AcceptPhone = function(phone){console.log('接听电话',phone)}// 外部调用代理ProxyAcceptPhone('12345566')ProxyAcceptPhone('18900044440')
什么是Proxy对象?
Proxy对象就是可以让你去对JavaScript中的一切合法对象的基本操作进行自定义.然后用你自定义的操作去覆盖其对象的基本操作.也就是当一个对象去执行一个基本操作时,其执行的过程和结果是你自定义的,而不是对象的。
首先Proxy的语法是:
let p = new Proxy(target, handler);
target是你要代理的对象.它可以是JavaScript中的任何合法对象.如: (数组, 对象, 函数等等)
handler是你要自定义操作方法的一个集合.
p是一个被代理后的新对象,它拥有target的一切属性和方法.只不过其行为和结果是在handler中自定义的.
在支持 Proxy 的浏览器环境中,Proxy 是一个全局对象, 可以直接使用。Proxy(target, handler) 是一个构造函数,target 是被代理的对象, handlder 是声明了各类代理操作的对象,最终返回一个代理对象。 外界每次通过代理对象访问 target 对象的属性时,就会经过 handler 对象, 从这个流程来看,代理对象很类似 middleware(中间件)。 那么 Proxy 可以拦截什么操作呢? 最常见的就是 get(读取)、set(修改)对象属性等操作, 此外,Proxy 对象还提供了一个 revoke 方法,可以随时注销所有的代理操作。
let obj ={ a:1, b:2}const p = new Proxy(obj,{ get(target,key,value){ if(key == 'c'){ return '我是自定义的2一个结果' }else{ return target[key]; } }, set(target,key,value){ if(value==4){ target[key]='我是自定义的一个结果' }else{ target[key] = value; } }})console.log(obj.a)//1console.log(obj.c)//underfinedconsole.log(p.a)//1console.log(p.c)//我是自定义的一个结果obj.name = '李白'console.log(obj.name)//李白console.log(p.name)//李白p.age=4console.log(obj.age)//我是自定义的一个结果console.log(p.age)//我是自定义的一个结果
Proxy对象的作用.即是之前所受的用于定义基本操作的自定义行为. 同样的get和set操作.没有没代理的对象所得的结果是其JavaScript本身的执行机制运行计算后所得到的. 而被代理了的对象的结果则是我们自定义的.
Proxy所能代理的范围—handler
在上面代码中,我们看到了构造一个代理对象时所传的第二个参数handler, 这个handler对象是由get和set两个函数方法组成的. 这两个方法会在一个对象被get和set时被调用执行, 以代替原生对象上的操作.那么为什么在handler, 定义get和set这两个函数名之后就代理对象上的get和set操作了呢? 实际上handler本身就是ES6所新设计的一个对象.它的作用就是用来自定义代理对象的各种可代理操作。 它本身一共有13中方法,每种方法都可以代理一种操作.
其13种方法如下:
handler.getPrototypeOf()// 在读取代理对象的原型时触发该操作,比如在执行 Object.getPrototypeOf(proxy) 时。handler.setPrototypeOf()// 在设置代理对象的原型时触发该操作,比如在执行 Object.setPrototypeOf(proxy, null) 时。handler.isExtensible()// 在判断一个代理对象是否是可扩展时触发该操作,比如在执行 Object.isExtensible(proxy) 时。handler.preventExtensions()// 在让一个代理对象不可扩展时触发该操作,比如在执行 Object.preventExtensions(proxy) 时。handler.getOwnPropertyDescriptor()// 在获取代理对象某个属性的属性描述时触发该操作,//比如在执行 Object.getOwnPropertyDescriptor(proxy, "foo") 时。handler.defineProperty()// 在定义代理对象某个属性时的属性描述时触发该操作,//比如在执行 Object.defineProperty(proxy, "foo", {}) 时。handler.has()// 在判断代理对象是否拥有某个属性时触发该操作,比如在执行 "foo" in proxy 时。handler.get()// 在读取代理对象的某个属性时触发该操作,比如在执行 proxy.foo 时。handler.set()// 在给代理对象的某个属性赋值时触发该操作,比如在执行 proxy.foo = 1 时。handler.deleteProperty()// 在删除代理对象的某个属性时触发该操作,比如在执行 delete proxy.foo 时。handler.ownKeys()// 在获取代理对象的所有属性键时触发该操作,比如在执行 Object.getOwnPropertyNames(proxy) 时。handler.apply()// 在调用一个目标对象为函数的代理对象时触发该操作,比如在执行 proxy() 时。handler.construct()// 在给一个目标对象为构造函数的代理对象构造实例时触发该操作,比如在执行new proxy() 时。
Proxy的作用
对于代理模式Proxy的作用主要体现在三个方面:
拦截和监视外部对对象的访问
2、 降低函数或类的复杂度
3、 在复杂操作前对操作进行校验或对所需资源进行管理
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755