摘要:著名的代理模式例子为引用计数英语指针对象。是一个构造函数,是被代理的对象,是声明了各类代理操作的对象,最终返回一个代理对象。在给一个目标对象为构造函数的代理对象构造实例时触发该操作,比如在执行时。
所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、内存中的大对象、文件或其它昂贵或无法复制的资源。
著名的代理模式例子为引用计数(英语:reference counting)指针对象。
当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少内存用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
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); 1. target是你要代理的对象.它可以是JavaScript中的任何合法对象.如: (数组, 对象, 函数等等) 2. handler是你要自定义操作方法的一个集合. 3. 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)//1 console.log(obj.c)//underfined console.log(p.a)//1 console.log(p.c)//我是自定义的一个结果 obj.name = "李白" console.log(obj.name)//李白 console.log(p.name)//李白 p.age=4 console.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的作用主要体现在三个方面: 1、 拦截和监视外部对对象的访问 2、 降低函数或类的复杂度 3、 在复杂操作前对操作进行校验或对所需资源进行管理
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/106334.html
摘要:面向对象设计里的设计模式之代理模式,相信很多朋友已经很熟悉了。代表当前执行方法的实例,即方法调用者。代表具体的方法名称。现在我们再次调用,传入构造器返回的代理对象打印输出,代理逻辑生效了和的一样优雅地实现了代理设计模式。 showImg(https://segmentfault.com/img/remote/1460000016760603);面向对象设计里的设计模式之Proxy(代理...
摘要:注意事项声明函数时候处理业务逻辑区分和单例的区别,配合单例实现初始化构造函数大写字母开头推荐注意的成本。简单工厂模式使用一个类通常为单体来生成实例。 @(书籍阅读)[JavaScript, 设计模式] 常见设计模式 一直对设计模式不太懂,花了一下午加一晚上的时间,好好的看了看各种设计模式,并总结了一下。 设计模式简介 设计模式概念解读 设计模式的发展与在JavaScript中的应用 ...
摘要:保护代理和虚拟代理保护代理当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。虚拟代理在程序中可以能有一些代价昂贵的操作。而虚拟代理是最常用的一种代理模式。 代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。...
摘要:缺点不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。预防低水平人员带来的风险。开闭原则,高拓展性。这里的订阅者称为观察者,而被观察者称为发布者,当一个事件发生,发布者会发布通知所有订阅者,并常常以事件对象形式传递消息。 介绍 最近开始给自己每周订个学习任务,学习结果反馈为一篇文章的输出,做好学习记录。 这一周(02.25-03.03)我定的目标是《JavaScript 模式》...
摘要:虚拟代理延迟执行虚拟代理的目的,是将开销大的运算延迟到需要时再执行。 showImg(https://segmentfault.com/img/bVbuitm?w=800&h=600); 代理模式:为一个对象提供一个代用品或占位符,以便控制它的访问。 当我们不方便直接访问某个对象时,或不满足需求时,可考虑使用一个替身对象来控制该对象的访问。替身对象可对请求预先进行处理,再决定是否转交给...
阅读 2246·2023-04-26 00:01
阅读 780·2021-10-27 14:13
阅读 1787·2021-09-02 15:11
阅读 3348·2019-08-29 12:52
阅读 503·2019-08-26 12:00
阅读 2549·2019-08-26 10:57
阅读 3349·2019-08-26 10:32
阅读 2830·2019-08-23 18:29