You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varadd=function(){varsum=0for(vari=0,l=arguments.length;i<l;i++){sum+=arguments[i]}returnsum}varproxyAdd=(function(){varcache={}//缓存运算结果的缓存对象returnfunction(){varargs=Array.prototype.join.call(arguments)if(cache.hasOwnProperty(args)){//等价 args in cacheconsole.log('使用缓存结果')returncache[args]//直接使用缓存对象的“值”}console.log('计算结果')returncache[args]=add.apply(this,arguments)//使用本体函数计算结果并加入缓存console.log(cache);}})()console.log(proxyAdd(1,2,3,4,5))console.log(proxyAdd(1,2,3,4,5))console.log(proxyAdd(1,2,3,4,5))// 输出结果计算结果15使用缓存结果15使用缓存结果15
varperson={name: "张三"};varproxy=newProxy(person,{get: function(target,property){if(propertyintarget){returntarget[property];}else{thrownewReferenceError("Property \""+property+"\" does not exist.");}}});proxy.name// "张三"proxy.age// 抛出一个错误
handler的set方法
参数:目标对象、属性名、属性值、proxy实例本身
例子:
letvalidator={set: function(obj,prop,value){if(prop==='age'){if(!Number.isInteger(value)){thrownewTypeError('The age is not an integer');}if(value>200){thrownewRangeError('The age seems invalid');}}// 对于满足条件的 age 属性以及其他属性,直接保存obj[prop]=value;}};leta={}letperson=newProxy(a,validator);person.age=100;a.age// 100person.age='young'// 报错person.age=300// 报错
handler的apply方法
参数:目标对象,目标对象的上下文,参数组 例子:
vartarget=function(){return'I am the target';};varhandler={apply: function(){return'I am the proxy';}};varp=newProxy(target,handler);p()// I am the proxy
什么是代理模式
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。
代理模式的划分
按职责来划分的话,分为以下8种代理:
1、缓存代理
2、虚拟代理
3、写时复制Copy-on-Write 代理
4、保护(Protect or Access)代理
5、Cache代理
6、防火墙(Firewall)代理
7、同步化(Synchronization)代理
8、智能引用(Smart Reference)代理
在js中常用到的是缓存代理和虚拟代理
虚拟代理
1、创建img标签
2、插入img标签
3、创建img对象
4、书写onloading方法
5、返回设置图片对象。
缺点:
1、代码耦合度比较大,一个函数内负责做了几件事情。未满足面向对象设计原则中单一职责原则;
2、当某个时候不需要图片预加载的时候,需要从myImage 函数内把代码删掉,这样代码耦合性太高。
1、myImage中创建img标签
2、myImage中插入img标签
3、myImage中返回设置imgNode的src方法
4、ProxyImage中创建img对象
5、ProxyImage中书写onload方法
6、ProxyImage中返回设置图片的方法。
优点:
1、myImage 函数只负责做一件事。创建img元素加入到页面中,其中的加载loading图片交给代理函数ProxyImage 去做。
2、加载成功以后,代理函数ProxyImage 会通知及执行myImage 函数的方法。
3、当以后不需要代理对象的话,我们直接可以调用本体对象的方法即可
缓存代理
缓存代理,就是将前面使用的值缓存下来,后续还有使用的话,就直接拿出来用。
两者的职责划分:add函数提供计算功能。proxyAdd提供访问add函数的功能和缓存功能。
es6中的proxy
proxy的用法
target是目标对象,handler是处理函数。
handler的内建方法集
handler的get方法
参数:目标对象、属性名、proxy实例本身
例子:
handler的set方法
参数:目标对象、属性名、属性值、proxy实例本身
例子:
handler的apply方法
参数:目标对象,目标对象的上下文,参数组
例子:
当调用p函数时,就会被
proxy
拦截,返回I am the proxy
。handler的construct方法
construct
方法用于拦截new
指令。参数:目标对象、构造函数的参数对象
例子:
proxy重写图片预加载
The text was updated successfully, but these errors were encountered: