当前位置: 首页 > Web前端 > HTML

JavaScript设计模式——代理模式

时间:2023-03-29 11:38:39 HTML

濡傛灉瑙夊緱鏂囩珷涓嶉敊锛岃鍏虫敞銆佺偣璧炪€佸垎浜紒缁х画鍒嗕韩鎶€鏈崥鏂囷紝鍏虫敞寰俊鍏紬鍙佛煈夝煆诲ソ涔呮病涓婂墠绔疞eBron浜嗭紝鎬庝箞杩欎箞涔呬笉鏇存柊锛焑mmm...鏈€杩戠殑鎬ц兘娴嬭瘎瀛o紝鎬ц兘鎬荤粨锛?60娴嬭瘎锛岃鍐欑殑涓滆タ寰堝锛岃€借浜嗕竴娈垫椂闂达紝搴熻瘽涓嶅璇达紝娆㈣繋JavaScript璁捐绗笁绡囨ā寮忥細浠g悊妯″紡~浠g悊妯″紡姒傚康浠g悊妯″紡涓哄璞℃彁渚涗唬鐞嗗璞℃垨鍗犱綅绗︼紝浠g悊瀵硅薄鎺у埗瀵瑰師濮嬪璞$殑寮曠敤銆備篃鍙互鐞嗚В涓哄澶栨毚闇茬殑鎺ュ彛涓嶆槸鍘熸潵鐨勫璞°€傞€氫織鍦拌锛岀敓娲讳腑涔熸湁姣旇緝甯歌鐨勪唬鐞嗘ā寮忥細涓粙銆佷唬閿€銆佺粡绾汉绛夌瓑銆傝繖绉嶆ā寮忕殑鎰忎箟鍦ㄤ簬锛屽綋鏉ヨ鑰呭拰鍙楄鑰呬笉鏂逛究鐩存帴璁块棶/鑱旂郴鏃讹紝鎻愪緵涓€涓浛浠h€呮潵澶勭悊浜ゆ槗杩囩▼銆傚疄闄呰闂槸鏇夸唬銆傛浛浠h€呭浜嬪姟鍋氫簡涓€浜涘鐞?杩囨护鍚庯紝鍐嶄紶閫掔粰鏈綋瀵硅薄锛屽噺杞绘湰浣撳璞$殑璐熸媴銆傛渶绠€鍗曠殑浠g悊妯″紡鐨勫疄鐜扮敱绠€鍗曞埌澶嶆潅銆傛垜浠簡瑙d簡浠g悊妯″紡鐨勭浉鍏虫蹇点€備笅闈㈡垜浠皢閫氳繃涓€涓渶绠€鍗曠殑浠g悊妯″紡鐨勪緥瀛愭潵瀹炵幇浠g悊妯″紡锛屼粠浠g爜涓劅鍙椾竴涓嬩唬鐞嗘ā寮忕殑娴佺▼銆傝皥璇濆緢渚垮疁銆傛樉绀轰唬鐮侊紒瀹㈡埛绔悜鏈嶅姟鍣ㄥ彂閫佽姹備唬鐞嗗皢璇锋眰杞彂鍒版湇鍔″櫒鏈嶅姟鍣ㄥ鐞嗚姹俢onstRequest=function(){};constclient={requestTo:(server)=>{constreq=newRequest();鏈嶅姟鍣?receiveRequest(req);},};constserver={handleRequest:(request)=>{console.log('receiverequest:',request);},};constproxy={receiveRequest:(request)=>{console.log('proxyrequest:',request);鏈嶅姟鍣?handleRequest锛堣姹傦級锛泒,};client.requestTo(proxy);/***proxyrequest:Request{}*receiverequest:Request{}*/ProtectionProxyProtectionProxy椤惧悕鎬濅箟灏辨槸淇濇姢鏈綋涓嶈鍩轰簬璧勬簮璁块棶鍏充簬鏉冮檺鎺у埗銆備笅闈㈡垜浠敤涓€涓満鏅拰涓€涓緥瀛愭潵瀹為檯浣撻獙涓€涓嬨€傚熀浜庝笂杩版渶灏忎唬鐞嗘ā寮忚繘琛屾墿灞曪紝鎴戜滑鍙互浣跨敤淇濇姢浠g悊鏉ヨ繃婊や笉璇疯嚜鏉ョ殑璧勬簮銆傞€氳繃韬唤楠岃瘉璇锋眰銆佺洃鍚湇鍔″櫒鍑嗗鍙戦€佽姹傜瓑鎿嶄綔锛屼繚鎶ゅ疄浣撴湇鍔″櫒鍏嶅彈闈炴硶璇锋眰鏀诲嚮锛屽噺杞绘湇鍔″櫒璐熸媴銆俢onstproxy={receiveRequest:(request)=>{//楠岃瘉韬唤constpass=validatePassport(request);if(pass){//鏈嶅姟鍣ㄥ氨缁悗鐩戝惉浠g悊璇锋眰server.listenReady(()=>{console.log('proxyrequest:',request);server.handleRequest(request);});}},};VirtualProxy铏氭嫙浠g悊浣滀负鍒涘缓鏄傝吹瀵硅薄鐨勫璞$殑浠h〃锛屽府鍔╂帶鍒舵槀璐佃祫婧愮殑鍒涘缓锛岀洿鍒扮湡姝i渶瑕佸畠浠椂锛屽啀鍒涘缓涓€涓璞°€傝櫄鎷熶唬鐞嗗厖褰撳璞$殑鏇夸唬鑰呫€傚璞″垱寤哄悗锛岀洿鎺ュ皢璧勬簮濮旀墭缁欏疄浣撳璞°€備笅闈㈠皢瀹炵幇涓€涓櫄鎷熶唬鐞嗗疄鐜板浘鐗囬鍔犺浇鐨勪緥瀛愶紝浠庝唬鐮佸拰瀹為檯鍦烘櫙涓劅鍙椾竴涓嬭櫄鎷熶唬鐞嗙殑鍔ㄤ綔銆傚疄浣撳浘鍍忓璞″畨瑁呭湪涓讳綋涓€傜敱浜庡姞杞藉浘鐗囪€楁椂楂樸€佹垚鏈珮锛屽洜姝ゅ湪鍔犺浇鍥剧墖璧勬簮鏃讹紝灏嗗疄浣撳浘鐗囧璞¤缃负loading鐘舵€併€備娇鐢ㄥ埆鍚嶅璞℃墽琛屽浘鐗囪祫婧愬姞杞姐€傜洃鍚埆鍚嶅璞¤祫婧愬姞杞斤紝灏嗚祫婧愭浛鎹负Entity瀵硅薄=>{imgNode.src=src;},setLoading:()=>{imgNode.src='loading.gif'}};})();constproxyImg=(()=>{//鏇胯韩imageobjectconsttempImg=newImage();//鐩戝惉璧勬簮鍔犺浇瀹屾垚鍚庯紝灏嗚祫婧愭浛鎹负瀹炰綋鍥剧墖瀵硅薄tempImg.onload=function(){img.setSrc(this.src);};return{//浠g悊寮€濮嬭缃疄浣撳璞′负loading鐘舵€侊紝浣跨敤鍒悕瀵硅薄寮€濮嬪姞杞藉浘鐗嘡esourcesetSrc:(src)=>{img.setLoading()tempImg.src=src;}}})();proxyImg.setSrc('file.jpg')浠g悊妯″紡鐨勫簲鐢ㄧ湅瀹屼簡淇濇姢浠g悊鍜岃櫄鎷熶唬鐞嗘垜浠啀鏉ョ湅鐪嬪墠绔唬鐞嗘ā寮忕殑涓€浜涘叿浣撳簲鐢ㄨ姹備紭鍖栵紙鍩嬬偣銆侀敊璇暟鎹仛鍚堜笂鎶ワ級.鍓嶆鏃堕棿鏈夊垢鍙楅個鍙傚姞浜咮yteTech瀛楄妭闈掕钀ョ殑璇勫銆傚鏌ョ殑涓昏閮ㄥ垎鏄墠绔洃鎺х郴缁熴€備富棰橀」鐩€傚墠绔洃鎺т細娑夊強鍒颁竴浜涢敊璇瓑淇℃伅鐨勪笂鎶ワ紝鏈夌殑椤圭洰鍙疄鐜版渶绠€鍗曠殑HTTP璇锋眰涓婃姤銆傞儴鍒嗛」鐩杩欓儴鍒嗗唴瀹瑰仛浜嗗涓嬩紭鍖栵紝鏄瘮杈冨悎閫傜殑浠g悊妯″紡瀹炶返鍦烘櫙锛歂avigator.sendBeacon浣跨敤鎴蜂唬鐞嗘湁鏈轰細寮傛鍙戦€佹暟鎹紙HTTPPOST锛夊埌鏈嶅姟绔紝涓嶅奖鍝嶄氦浜掓€ц兘https锛?/developer.mozilla.org...鏁版嵁鑱氬悎涓婃姤锛堜紭鍖栫増鏃犱唬鐞嗘ā寮忥紝姣忎唤鎶ュ憡浣跨敤璇锋眰涓婃姤锛夊噺灏戣姹傛鏁帮紝鑱氬悎澶氫釜浜嬩欢/淇℃伅锛岀敤浜庝笂鎶ュ畾鏃跺拰瀹氶噺鍒嗙粍涓嬮潰涓や釜绠€鍗曞疄鐜颁笂鎶ュ師鐞嗗浘浠g爜璁℃椂constevents=[];constTIMER=10000;lettimer=null;constinit=()=>{//鍒濆鍖栨椂鍚姩瀹氭椂鍣╰imer=setInterval(()=>{//瀹氭椂浣跨敤sendBeacon鎶ュ憡constevts=events.splice(0,events.length);navigator.sendBeacon('/path',{events:evts});},TIMER);};constdestroyed=()=>{//褰撳畾鏃跺櫒琚攢姣佹椂娓呴櫎瀹氭椂鍣╟learInterval(timer);};constreport=(eventName,data)=>{//sdk鎶ヨ〃宸ュ叿鍑芥暟锛岃仛鍚堜簨浠秂vents.push({eventName,data,});};閲忓寲鍒嗙粍constevents=[];constLIMIT=10;constreportRequest=()=>{//閲忓寲鍒嗙粍浣跨敤sendBeacon涓婃姤constevts=events.splice(0,LIMIT);navigator.sendBeacon('/path',{events:evts});};constreport=(eventName,data)=>{//sdk涓婃姤宸ュ叿鍑芥暟锛岃仛鍚堜簨浠秂vents.push({eventName,data,});濡傛灉锛堜簨浠躲€傞暱搴?=LIMIT){reportRequest();}};鏁版嵁缂撳瓨浠g悊涔嬪墠鐪嬭繃涓€閬撻潰璇曢锛氱紦瀛樿繃鏈熸椂鍓嶇濡備綍鑷姩鍒犻櫎缂撳瓨锛熷鏋滄闈㈡€濊€冿紝缂撳瓨杩囨湡锛岀▼搴忓叧闂紝濡備綍鍒犻櫎鍛紵鍙︿竴绉嶆柟寮忥細杩囨湡鏃朵笉瑕佺珛鍗宠缃紝鑾峰彇鏃跺彧闇€瑕佸垽鏂紦瀛樻槸鍚﹁繃鏈熷嵆鍙€傛嬁鍒扮殑鏃跺€欓渶瑕佸垽鏂紦瀛樻槸鍚﹁繃鏈熴€傝繃鏈熶簡鍙互鍒犻櫎鍝閫氳繃ProxyStorage浠g悊缂撳瓨涓棿浠讹紝瀹炵幇浜嗘敮鎸佽缃紦瀛樿繃鏈熸椂闂寸殑浠g悊灞傘€傛槗浜庡垏鎹㈢紦瀛樹腑闂翠欢锛屽鍔犲彲缁存姢鎬,get(key){constv=localStorage.getItem(key);濡傛灉(!v){杩斿洖绌哄€硷紱}const{maxAge,value,time}=JSON.parse(v);constnow=Date.now();濡傛灉锛堢幇鍦?鏃堕棿+maxAge*1000锛墈杩斿洖鍊硷紱}else{localStorage.removeItem(key);杩斿洖绌哄€硷紱}},has(key){constv=localStorage.getItem(key);濡傛灉锛堬紒v锛墈杩斿洖鍋囷紱}const{maxAge,time}=JSON.parse(v);constnow=Date.now();濡傛灉锛堢幇鍦?鏃堕棿+maxAge*1000锛墈杩斿洖鐪燂紱}else{localStorage.removeItem(key);r杩斿洖鍋囷紱}},};璇锋眰鍑芥暟鐨勫皝瑁呴€氳繃浠g悊鏂瑰紡灏佽璇锋眰鍑芥暟锛屽彲浠ュ疄鐜板涓嬪姛鑳斤細妞嶅叆閫氱敤鍙傛暟锛岄€氱敤璇锋眰澶村叏灞€璇锋眰鍩嬬偣涓婃姤鍏ㄥ眬寮傚父鐘舵€佺爜澶勭悊鍣ㄥ叏灞€璇锋眰閿欒锛屽紓甯镐笂鎶ュ拰澶勭悊constSUCCESS_STATUS_CODE=200,FAIL_STATUS_CODE=400;constisValidHttpStatus=(statusCode)=>statusCode>=SUCCESS_STATUS_CODE&&statusCode{const{headers,method,data,params,url}=reqParams;//灏佽璇锋眰鍙傛暟锛屾鍏ラ€氱敤鍙傛暟鍜岄€氱敤璇锋眰澶碿onstrequestObj={url:url+`?$鈥嬧€媨qs.stringify({...commonParams,...params})}`,headers:{...commonHeaders,...headers},鏁版嵁,鏂规硶,寮€濮?Date.now(),};try{//寮€濮嬫姤鍛婅姹俽eportEvent(AJAX_START,requestObj);constres=awaitajax(requestObj);requestObj.end=Date.now();requestObj.response=res;//鎶ュ憡璇锋眰缁撴潫reportEv(AJAX_END,requestObj);const{statusCode,data:resData}=res;Const{errorCode}=resData;if(!isValidHttpStatus(statusCode)){//寮傚父鐘舵€佺爜鐨勫煁鎶ュ憡reportEvent(AJAX_ERROR,requestObj);鎶涘嚭璧勬簮鏁版嵁锛泒elseif(errorCode){//閿欒鐮佸叏灞€澶勭悊鍣ㄥ畾涔夊鏋滄病鏈夊畾涔夛紝鍚戜笂灞備笟鍔℃祦绋嬫姏鍑洪敊璇痳eportEvent(AJAX_WARNING,requestObj);if(ErrorHandler(errorCode)){ErrorHandler(errorCode)();}else{鎶涘嚭resData;姝e父}/}else{/returnresData;}}catch(error){//鎹曡幏閿欒骞朵笂鎶ョ粰涓婂眰杩涜涓氬姟澶勭悊requestObj.error=error;reportEvent(AJAX_ERROR,requestObj);鎶涘嚭閿欒锛泒};Vue涓殑浠g悊妯″紡灏嗘暟鎹€佹柟娉曘€佽绠楀睘鎬х瓑浠g悊鍒扮粍浠跺疄渚嬩笂letvm=newVue({data:{msg:'hello',vue:'vue'},computed:{helloVue(){returnthis.msg+''+this.vue}},mounted(){console.log(this.helloVue)}})Koacontext浠g悊妯″紡context浠g悊灏佽鍦ㄨ姹傚拰鍝嶅簲灞炴€т腑app.use((context)=>{console.log(context.request.url)console.log(context.url)console.log(context.response.body)console.log(context.body)})鍏朵粬浠g悊妯″紡闄や簡鏈枃鎻愬埌鐨勪唬鐞嗘ā寮忓簲鐢ㄤ箣澶栵紝杩樻湁寰堝鍏朵粬鐨勫彉浣撳拰搴旂敤銆傝繖閲岀畝鍗曠綏鍒楀拰浠嬬粛涓€涓嬶紝灏变笉涓€涓€璇︾粏瑙i噴浜嗐€傞槻鐏浠g悊锛氭帶鍒剁綉缁滆祫婧愯闂紝淇濇姢涓讳綋涓嶈鈥滃潖浜衡€濇帴杩戣繙绋嬩唬鐞嗭細涓轰竴涓璞″湪涓嶅悓鐨勨€嬧€嬪湴鍧€绌洪棿鎻愪緵鏈湴琛ㄧず锛屾瘮濡傛垜浠殑鈥滅瀛﹀湪绾库€濅繚鎶や唬鐞嗭細鐢ㄤ簬瀵硅薄涓嶅瓨鍦ㄧ殑鎯呭喌搴旇鏈変笉鍚岀殑璁块棶鏉冮檺Smartreferenceagent:replace涓€涓畝鍗曠殑鎸囬拡锛屽湪璁块棶涓€涓璞℃椂鎵ц涓€浜涢澶栫殑鎿嶄綔锛屾瘮濡傜粺璁′竴涓璞¤寮曠敤鐨勬鏁帮紙鍙兘鐢ㄤ簬GC寮曠敤璁℃暟姹囨€讳唬鐞嗘ā寮忔湁寰堝灏忓垎绫伙紝浠ュ強鍓嶇寮€鍙戝伐浣滀腑甯哥敤鐨勮櫄鎷熶唬鐞嗭紝ProtectionProxy鍜孋acheProxy绛夈€傚叾瀹炵湅瀹岃繖閲岋紝浣犱篃鑳芥劅鍙楀埌鏃ュ父寮€鍙戝伐浣滀腑缁忓父鍋氱殑涓€涓姩浣溾€斺€斺€滃皝瑁呪€濓紝鏄叾瀹炰唬鐞嗘ā寮忕殑搴旂敤~DesignPatterns绯诲垪鏂囩珷鎺ㄨ崘JavaScript璁捐妯″紡-鍗旹xampleModeJavaScriptDesignMode-StrategyMode缁璭鍒嗕韩鎶€鏈崥鏂囷紝娆㈣繋鍏虫敞锛佸井淇″叕浼楀彿锛氬墠绔疞eBronNuggets锛氬墠绔疞eBron鐭ヤ箮锛氬墠绔疞eBron