概念
当不方便直接访问本体对象时,提供一个替身对象来代替直接访问本体对象,替身对象相当于中间路由,访问替身对象时,在替身对象中做一些处理操作,再由替身对象代理访问本体对象。
示例
var _A = {
aFun: function( txt ){
_B.bFun(txt) // 让 _B 代理发送
}
}
var _B = {
bFun: function( txt ){
console.log('将消息代理给_C')
_C.cFun(txt) //
}
}
var _C = {
cFun: function( txt ){
console.log(txt)
}
}
_A.aFun('发送消息')
- 解释
- _A 先将消息传递给 _B ,通过 _B 的代理让 _B 发送消息给 _C。
- 为什么代理
从上述代码来看,为什么 _A 不直接给 _C ,而用代理增加代码复杂度,但是如果 _C 需要在特定的时间才需要这个消息,而 _B 有可以监听 _C 的能力,此时代理就可用了。
上述 _B 就起到了代理的作用,可以帮 _C 筛选,过滤一些 _C 不需要的消息。var _A = { aFun: function( txt ){ _B.bFun(txt) // 让 _B 代理发送 } } var _B = { bFun: function( txt ){ console.log('将消息代理给_C') _C.timeout(function(){ // _B 有能力监听 _C 什么时候需要接受消息 _C.cFun(txt) }) } } var _C = { cFun: function( txt ){ console.log(txt) } timeout: function(fn) { // 延时接受消息 setTimeout(()=>{ fn() },2000) } } _A.aFun('发送消息')
缓存代理
可以使一些花销较大的计算结果缓存起来,方便后续的使用
var jisuan = function(){
let n
for(let i,l = arguments.length;i<l;i++){
n += arguments[i]
}
return n
}
var nums = (function(){
let cache = {}
return function(){
let args = Array.prototype.join.call(arguments,',')
if(args in cache){
return cache[args]
}
return cache[arge] || cache[arge] = jisuan.apply( this, arguments)
}
})()
nums(1,2,3) // 6
nums(1,2,3) // 6
nums 进行第二次调用时,并没有真正的执行计算函数,而是用的 cache 中已经计算好的结果,缓存代理一般应用与 ajax 异步请求。