Skip to content

Commit ef8e57b

Browse files
committed
代理模式
1 parent 6029de5 commit ef8e57b

File tree

1 file changed

+305
-0
lines changed

1 file changed

+305
-0
lines changed

six-chapter/agent.js

+305
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
1+
var Flower = function (){}
2+
3+
var xiaoming = {
4+
sendFlower:function(target){
5+
var flower = new Flower()
6+
target.receiveFlower(flower)
7+
}
8+
};
9+
10+
var B = {
11+
receiveFlower:function(flower){
12+
A.listenGoodMood(function(){
13+
A.receiveFlower(flower)
14+
})
15+
}
16+
}
17+
var A = {
18+
receiveFlower:function(flower){
19+
console.log('收到花' + flower)
20+
},
21+
listenGoodMood:function(fn){
22+
setTimeout(function(){
23+
fn();
24+
},1000 * 10)
25+
}
26+
}
27+
28+
xiaoming.sendFlower(B);
29+
30+
31+
//保护代理 用于控制不同权限的对象对目标对象的访问
32+
//虚拟代理 虚拟代理是最常用的一种代理模式 把一些开销很大的对象,延迟到 真正需要它的时候才去创建
33+
var B = {
34+
receiveFlower:function(flower){
35+
A.listenGoodMood(function(){
36+
var flower = new Flower();
37+
A.receiveFlower(flower);
38+
})
39+
}
40+
}
41+
42+
//虚拟代理实现图片预加载
43+
// var myImage = (function () {
44+
// var imgNode = document.createElement('img')
45+
// document.body.appendChild(imgNode)
46+
47+
// return {
48+
// setSrc:function(src){
49+
// imgNode.src = src
50+
// }
51+
// }
52+
// })()
53+
54+
// myImage.setSrc('http:// imgcache.qq.com/music/photo/k/000GGDys0yA0Nk.jpg')
55+
56+
var myImage = (function(){
57+
var imgNode = document.createElement('img')
58+
document.body.appendChild(imgNode);
59+
60+
return {
61+
setSrc: function(src){
62+
imgNode.src = src;
63+
}
64+
}
65+
})()
66+
67+
var proxyImage = (function(){
68+
var img = new Image();
69+
img.onload = function(){
70+
myImage.setSrc(this.src)
71+
}
72+
73+
return {
74+
setSrc:function(src){
75+
myImage.setSrc('file:// /C:/Users/svenzeng/Desktop/loading.gif')
76+
img.src = src;
77+
}
78+
}
79+
})()
80+
81+
proxyImage.setSrc('http:// imgcache.qq.com/music/photo/k/000GGDys0yA0Nk.jpg')
82+
83+
//没有代理的图片预加载 违反单一职能原则和封闭-开放原则
84+
var MyImage = (function(){
85+
var imgNode = document.createElement('img')
86+
document.body.appendChild(imgNode);
87+
88+
var img = new Image()
89+
img.onload = function(){
90+
imgNode.src = img.src;
91+
}
92+
return {
93+
setSrc:function (src) {
94+
imgNode.src = 'file:// /C:/Users/svenzeng/Desktop/loading.gif'
95+
img.src = src
96+
}
97+
}
98+
})()
99+
100+
101+
//虚拟代理合并HTTP请求
102+
var syncFile = function(id){
103+
console.log('开始同步文件, id为: ' + id);
104+
}
105+
106+
var checkbox = document.getElementsByTagName('input')
107+
108+
for(var i=0,c; c = checkbox[i++];){
109+
c.onclick = function(){
110+
if(this.checked === true){
111+
syncFile(this.id)
112+
}
113+
}
114+
}
115+
116+
//代理函数 proxySynchronousFile 来收集一段时间之内的请求, 最后一次性发送给服务器
117+
118+
var syncFile = function(id){
119+
console.log('开始同步文件, id为: ' + id);
120+
}
121+
122+
var proxySyncFile = (function(){
123+
var cache = [] //数组保存一段时间内同步的id
124+
var timer = null ;
125+
126+
return function(id){
127+
cache.push(id)
128+
if(timer){
129+
return ;
130+
}
131+
132+
timer = setTimeout(function(){
133+
syncFile(cache.join(',')) //打印字符串
134+
clearTimeout(timer);
135+
timer = null;
136+
cache.length = 0 ; //清空id 集合
137+
},2000)
138+
}
139+
})()
140+
141+
var checkbox = document.getElementsByTagName('input');
142+
143+
for(var i=0,c;c=checkbox[i++];){
144+
c.onclick = function(){
145+
if(this.checked === true){
146+
proxySyncFile(this.id)
147+
}
148+
}
149+
}
150+
151+
//为加载真正的 miniConsole.js 代码如下
152+
153+
var cache = []
154+
var miniConsole = {
155+
log:function(){
156+
var args = arguments;
157+
cache.push(function(){
158+
return miniConsole.log.apply(miniConsole,args);
159+
})
160+
}
161+
}
162+
163+
miniConsole.log(1);
164+
165+
//当用户按下F12时,开始加载真正的miniConsole.js
166+
var handler = function(ev){
167+
if(ev.keyCode === 113){
168+
var script = document.createElement('script')
169+
script.onload = function(){
170+
for(var i=0,fn;fn = cache[i++];){
171+
fn()
172+
}
173+
}
174+
175+
script.src = 'miniConsole.js'
176+
document.getElementsByTagName('head')[0].appendChild(script)
177+
}
178+
}
179+
180+
document.body.addEventListener('keydown',handler,false)
181+
182+
//miniConsole.js 中的代码
183+
miniConsole = {
184+
log:function(){
185+
console.log(Array.prototype.join.call(arguments));
186+
}
187+
}
188+
189+
//要保证在 F2 被重复按下的时候,miniConsole.js 只被加载一次
190+
//miniConsole 代理对象的代码,使它成为一个标准的虚拟代理对象
191+
192+
var miniConsole = (function(){
193+
var cache = [];
194+
var handler = function(ev){
195+
if(ev.keyCode === 113){
196+
var script = document.createElement('script')
197+
script.onload = function(){
198+
for(var i=0,fn;fn = cache[i++];){
199+
fn()
200+
}
201+
};
202+
script.src = 'miniConsole.js'
203+
document.getElementsByTagName('head')[0].appendChild(script)
204+
//只加载一次
205+
document.body.removeEventListener('kedown',handler);
206+
}
207+
};
208+
209+
document.body.addEventListener('keydown',handler,false)
210+
211+
return {
212+
log:function(){
213+
var args = arguments;
214+
cache.push(function(){
215+
return miniConsole.log.apply(miniConsole,args);
216+
})
217+
}
218+
}
219+
})()
220+
221+
miniConsole.log(11);
222+
223+
//miniConsole.js 中的代码
224+
miniConsole = {
225+
log:function(){
226+
console.log(Array.prototype.join.call(arguments));
227+
}
228+
}
229+
230+
//缓存代理 类似的联想到 vue computed
231+
var multi = function(){
232+
console.log('开始计算成绩');
233+
var = 1;
234+
for(var i=0;i<arguments.length;i++){
235+
a = a * arguments[i]
236+
}
237+
return a;
238+
}
239+
240+
multi(2,3)
241+
multi(2,3,4,5)
242+
243+
//加入缓存代理
244+
var proxyMult = (function(){
245+
var cache = {}
246+
247+
return function(){
248+
var args = Array.prototype.join.call(arguments,',');
249+
if(args in cache){
250+
return cache[args];
251+
}
252+
return cache[args] = multi.apply(this,arguments);
253+
}
254+
})()
255+
256+
proxyMult(1,2,,3,4)
257+
proxyMult(1,2,3,4)
258+
259+
260+
//缓存代理用于异步的ajax请求数据,分页的数据只要请求一次
261+
262+
//高阶函数动态创建代理
263+
264+
/*计算乘积*/
265+
var multi = function(){
266+
console.log('开始计算成绩');
267+
var = 1;
268+
for(var i=0;i<arguments.length;i++){
269+
a = a * arguments[i]
270+
}
271+
return a;
272+
}
273+
274+
/*计算加和*/
275+
var plus = function(){
276+
console.log('开始计算成绩');
277+
var = 1;
278+
for(var i=0;i<arguments.length;i++){
279+
a = a + arguments[i]
280+
}
281+
return a;
282+
}
283+
284+
/*创建缓存代理的工厂*/
285+
var createProxyFactory = function(fn){
286+
var cache = {}
287+
return function(){
288+
var args = [].join.call(arguments,',')
289+
if(args in cache){
290+
return cache[args];
291+
}
292+
return cache[args] = fn.apply(this,arguments)
293+
}
294+
}
295+
296+
297+
var proxyMult = createProxyFactory( mult ),
298+
proxyPlus = createProxyFactory( plus );
299+
300+
alert ( proxyMult( 1, 2, 3, 4 ) );
301+
alert ( proxyMult( 1, 2, 3, 4 ) );
302+
alert ( proxyPlus( 1, 2, 3, 4 ) );
303+
alert ( proxyPlus( 1, 2, 3, 4 ) );
304+
305+
//javacript 在 JavaScript 开发中最常用的是虚拟代理和缓存代理

0 commit comments

Comments
 (0)