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