定义
一般由于一个对象不能直接引用另一个对象,所以需要通过代理对象来起到中介的作用。
**
保护代理和虚拟代理
保护代理
- 代理 B 可以帮助 A过滤掉一些请求,比如送花的人中年龄太大的或者没有宝马的,这种请求就可以直接在代理 B处被拒绝掉这种代理叫作保护代理。
- 保护代理用于控制不同权限的对象对目标对象的访问,但在 JavaScript并不容易实现保护代理,因为我们无法判断谁访问了某个对象。而虚拟代理是最常用的一种代理模式
虚拟代理
虚拟代理把一些开销很大的对象,延迟到真正需要它的时候才去创建
常见模型
跨域
事件代理
事件委托还有一个名字叫事件代理
demo
jQuery中的proxy
因为在setTimeout中this指向全局对象
经典案例
明星经纪人
虚拟代理实现图片预加载
不用代理的预加载图片函数实现如下
var myImage = (function(){var imgNode = document.createElement("img");document.body.appendChild(imgNode);var img = new Image();// img.onload 是在图片加载完成之后操作的本身是异步事件// 这里的img只是作为src地址的载体,本身不参与文档img.onload = function(){imgNode.src = this.src;};return {setSrc: function(src) {imgNode.src = "http://img.lanrentuku.com/img/allimg/1212/5-121204193R0.gif";img.src = src;}}})();
代理模式解决方案
// 我们将多个事件抽取出来这样他就能干更多的事了var myImage = (function(){var imgNode = document.createElement("img");document.body.appendChild(imgNode);return {setSrc: function(src) {imgNode.src = src;}}})();// 代理模式var ProxyImage = (function(){var img = new Image();img.onload = function(){myImage.setSrc(this.src);};return {setSrc: function(src) {myImage.setSrc("http://img.lanrentuku.com/img/allimg/1212/5-121204193R0.gif");img.src = src;}}})();// 调用方式ProxyImage.setSrc("https://www.baidu.com/img/bd_logo1.png");代理模式中国将new image的操作取了出来节约了计算资源
总结
- 代理对象可以代替本体对象被实例化,此时本体对象未真正实例化,等到合适时机再实例化。
- 代理模式可以延迟创建开销很大的本体对象,他会把本体的实例化推迟到有方法被调用时。

