亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用AOP改善javascript代碼

2019-11-20 12:34:26
字體:
來源:轉載
供稿:網友

Aop又叫面向切面編程,用過spring的同學肯定對它非常熟悉,而在js中,AOP是一個被嚴重忽視的技術點,這篇就通過下面這幾個小例子,來說說AOP在js中的妙用.

1, 防止window.onload被二次覆蓋.
2,無侵入的統計代碼.
3, 分離表單請求和校驗.
4,給ajax請求動態添加參數.
5,職責鏈模式.
6, 組合代替繼承.

先給出before和after這2個“切面”函數. 顧名思義,就是讓一個函數在另一個函數之前或者之后執行,巧妙的是,before或者after都可以和當前的函數公用this和arguments, 這樣一來供我們發揮的地方就多著了.

/

處理window.onload被二次覆蓋.

前段時間看到QQ群里有個人問問題,要改寫window.onload, 怎么才能不把以前的window.onload函數覆蓋掉.

最原始的方案肯定是直接在原來的window.onload里添上你的新代碼.

/

這樣的壞處非常明顯,需要去改動原有的函數, 是侵入性最強的一種做法.

另外一種稍微好點的方案是用中間變量保存以前的window.onload;

/

這樣一來,多了一個討厭的中間變量__onload, 來管理它也要花費一些額外的成本.

試想一下這個場景,當人覺得天氣冷,出門的時候很自然選擇穿上一件貂皮大衣,而不是把自己的皮扯掉換成貂皮. 動態裝飾的好處就體現出來了,完全不會侵入之前的函數.

/

無侵入的統計代碼

本身跟邏輯沒有任何關聯的統計代碼要被硬插進函數里, 這點相信很多搞過上報的同學都很不爽. 比如下面這段代碼, 用來統計一個創建1000個節點的函數在用戶的電腦上要花費多少時間.

/

用aop的方式,不再需要在函數內部做改動,先定義一個通用的包裝器.

/

只要一行代碼,便能給任何函數都加上統計時間的功能.

/

分離表單請求和校驗

我們在提交表單之前經常會做一些校驗工作,來確定表單是不是應該正常提交. 最糟糕的寫法是把驗證的邏輯都放在send函數里面.

/

而更好的方式是把所有的校驗規則用策略模式放到一個集合里,返回false或者true來決定是否通過驗證. 這樣可以隨意的選擇和更換校驗規則.

/

這樣還有一個缺點,校驗和發送請求這2個請求耦合到了一個函數里面, 我們用aop來把它們分離開來, 把validata做成插件化,真正的即插即用. 只需把send函數改成:

/

過最前面Function.prototype.before的代碼不難看出,我們約定,當前一個函數返回false, 就會阻斷下一個函數的執行, 所以當validata返回false的時候, 便不再繼續執行send. 而因為之前提到的before函數可以和當前函數公用this和arguments, 所以value參數也能順利的傳遞到validata函數里.

給ajax請求動態添加參數

第一個例子里window.onload是用的after后置裝飾, 這里是用before前置裝飾. 在ajax請求之前動態添加一些參數.

我們遇到過很多跨域的請求, jsonp和iframe都是很常用的方式. 之前在我們的項目里,用參數retype=jsonp表示是jsonp請求, retype=iframe表示是iframe請求. 除此之外這2個請求的參數沒有任何區別. 那么可以用before把retype參數動態裝飾進去.

先定義一個ajax請求的代理函數./

這個函數里面沒有邏輯處理和分支語句,它也不關心自己是jsonp請求還是iframe請求. 它只負責發送數據, 是一個單一職責的好函數.

接下來在發送請求前放置一個before裝飾器.

/

開始發送請求:

/

職責鏈模式.

職責鏈模式在js中典型的應用場景是事件冒泡. 將所有子節點和父節點連成一條鏈,并沿著這條鏈傳遞事件,直到有一個節點能夠處理它為止. 職責鏈模式是消除過多的if else語句的神器.

拿最近做的一個需求來舉例, 有個文件上傳的功能, 提供了控件,html5, flash, 表單上傳這4種上傳方式. 根據它們的優先級以及瀏覽器支持情況來判斷當前選擇哪種上傳方式. 在我進行改造之前,它的偽代碼大概是這樣:

/

當然實際的代碼遠不只這么多,其中還包括了各種控件初始化,容錯等情況。有天我需要屏蔽掉flash,看起來是很簡單的需求,但難度實際跟在心臟旁邊拆掉一根毛線血管類似.

如果試試職責鏈模式呢, 看看事情將變得多簡單:

第一步先改寫之前的after函數,使得返回一個對象時阻斷職責鏈的傳遞,而返回null時繼續傳遞請求。

/

接下來把每種控件的創建方式都包裹在各自的函數中, 確保沒有邏輯交叉和相互污染.

/

最后用職責鏈把它們串起來:

/

可以預見,某天我又需要屏蔽掉flash, 那時的我只需要改動這一行代碼. 改成:

/

組合代替繼承

很多時候我們在設計程序的時候,會遇到使用組合還是繼承的問題. 通常來講, 使用組合更靈活輕巧. 還是拿之前文件上傳來舉例.

我定義了一個超類Upload, 衍生出4個子類.
Plugin_Upload, Html5_Upload, Flash_Upload以及Form_Upload.

Plugin_Upload會繼承父類,得到Upload的大部分功能, 然后對控件上傳的一些特性進行個性定制. 比如其它3種上傳方式都是選擇文件后便開始上傳. 而控件上傳在開始上傳之前會經過一輪文件掃描.

第一種做法是Plugin_Upload繼承Upload, 然后重寫它的start_upload方法.

/

用更輕的組合方式, 可以直接給原來的start_upload函數裝飾上掃描功能, 甚至不需要衍生一個額外的子類.

/

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品99一区| 国产精品一区二区在线| 一级做a爰片久久毛片美女图片| 欧美专区日韩视频| 456国产精品| 一区二区三区精品99久久| 久久免费在线观看| 欧美在线xxx| 国产精品久久久久久久久久久久久久| 91精品国产自产91精品| 国产日韩av高清| www高清在线视频日韩欧美| 91热福利电影| 日韩高清av一区二区三区| 精品久久久久久久久久ntr影视| 97视频免费看| 日韩电影中文字幕在线| 中文字幕精品www乱入免费视频| 久久视频精品在线| 亚洲视频国产视频| 亚洲美女激情视频| 欧美日韩免费一区| 少妇久久久久久| 亚洲精品国产拍免费91在线| 亚洲iv一区二区三区| 国产视频亚洲视频| 久久91亚洲精品中文字幕| 夜夜躁日日躁狠狠久久88av| 亚洲国产精品va在线观看黑人| 国产日韩欧美黄色| 欧美诱惑福利视频| 国产91精品高潮白浆喷水| 国产精品扒开腿爽爽爽视频| 久久综合色88| 欧美激情一区二区三级高清视频| 欧美黄色片视频| 日韩av在线免费播放| 亚洲国产精品福利| 亚洲色图校园春色| 日韩中文字幕免费看| 国产精品久久久久高潮| 97国产精品视频人人做人人爱| 一本一本久久a久久精品牛牛影视| 一区二区三区动漫| 国产精品久在线观看| 亚洲天堂av网| 日韩最新中文字幕电影免费看| 亚洲激情视频在线观看| 中文字幕久热精品视频在线| 国产一区二区日韩精品欧美精品| 人人澡人人澡人人看欧美| 欧美激情中文字幕在线| 欧美激情图片区| 日韩中文字幕免费| 国语自产偷拍精品视频偷| 国产日产欧美a一级在线| 久久韩剧网电视剧| 福利一区视频在线观看| 97视频在线免费观看| 国产精品偷伦视频免费观看国产| 成人免费观看a| 国产精品久久久久久中文字| 色婷婷亚洲mv天堂mv在影片| 热re91久久精品国99热蜜臀| 亚洲国产欧美一区二区三区久久| 91网站免费观看| 国产成人综合精品在线| 国内精品400部情侣激情| 插插插亚洲综合网| 欧美黑人性猛交| 国产精品久久久久久久久久东京| 国产一区二区三区丝袜| 亚洲成色777777女色窝| 国产97人人超碰caoprom| 91久久嫩草影院一区二区| 中文字幕亚洲欧美日韩高清| 久久99视频免费| 理论片在线不卡免费观看| 亚洲国产欧美在线成人app| 久久综合久久美利坚合众国| 91产国在线观看动作片喷水| 欧美日本国产在线| 国产欧美亚洲精品| 亚洲人成人99网站| 欧美亚洲国产另类| 国产美女久久精品香蕉69| 国产精品免费一区| 亚洲国产成人在线视频| 日韩电影大片中文字幕| 精品久久香蕉国产线看观看亚洲| 成人a视频在线观看| 国产成人精品a视频一区www| 精品色蜜蜜精品视频在线观看| 久久久伊人欧美| 久久国产精品电影| 日韩在线观看免费高清完整版| 精品一区二区电影| 亚洲视频在线免费观看| 亚洲欧美一区二区三区在线| 日韩在线精品一区| 91中文在线观看| 日韩av在线一区二区| 欧美男插女视频| 欧美成在线观看| 亚洲欧美日韩天堂| 国产精品一区二区三区在线播放| 91牛牛免费视频| 91精品免费看| 草民午夜欧美限制a级福利片| 国产精品电影久久久久电影网| 亚洲福利视频在线| 欧美一区二区三区……| 欧美日韩国产第一页| 2020久久国产精品| 91久久精品日日躁夜夜躁国产| 日韩在线观看高清| 欧美亚洲日本网站| 一本一本久久a久久精品综合小说| 亚洲国产精品热久久| 欧美成人合集magnet| 精品国产31久久久久久| 亚洲永久免费观看| 91丝袜美腿美女视频网站| 亚洲视频自拍偷拍| 日韩女优人人人人射在线视频| 精品久久久久久久大神国产| 欧美激情乱人伦一区| 久久久久久九九九| 欧美电影免费观看高清完整| 91伊人影院在线播放| 色综久久综合桃花网| 欧美日韩黄色大片| 欧美小视频在线| 自拍偷拍亚洲区| 美女999久久久精品视频| 91人人爽人人爽人人精88v| 中文字幕亚洲一区二区三区| 中文字幕久久精品| 亚洲精品大尺度| 青青久久aⅴ北条麻妃| 亚洲97在线观看| 欧美日韩亚洲成人| 深夜福利一区二区| 日韩欧美在线一区| 亚洲电影免费在线观看| 亚洲国产精品福利| 国产精品美女av| 一区二区在线视频播放| 色噜噜狠狠狠综合曰曰曰| 国产精品高潮呻吟久久av无限| 夜夜嗨av色一区二区不卡| 欧美激情中文字幕乱码免费| 欧美视频在线观看 亚洲欧| 亚洲精品在线不卡| 久久在线观看视频| 国产精品精品视频一区二区三区| 国产欧美日韩高清| 欧美激情a∨在线视频播放| 国产91在线高潮白浆在线观看| 欧美成年人视频网站欧美| 亚洲欧美在线第一页| 欧美激情二区三区| 国产亚洲xxx| 国产日韩欧美日韩大片|