<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript中AOP的實現與應用

        來源:懂視網 責編:小采 時間:2020-11-27 21:57:30
        文檔

        JavaScript中AOP的實現與應用

        JavaScript中AOP的實現與應用:1. 簡介 AOP (Aspect Oriented Programming) ,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是函數式編程的一種衍生,利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦
        推薦度:
        導讀JavaScript中AOP的實現與應用:1. 簡介 AOP (Aspect Oriented Programming) ,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是函數式編程的一種衍生,利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦

        1. 簡介

        AOP (Aspect Oriented Programming) ,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是函數式編程的一種衍生,利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

        2. 基礎實現

        使用過java spring的同學一定知道,其內分為三種通知,before(前置通知)、after(后置通知)、around(環繞通知)。
        下面我們分別在js調用方法時實現這三種通知:

        before(前置通知)

        顧名思義,就是在函數調用前執行

        Function.prototype.before = function (beforefun) {
         var _orgin = this; // 保存原函數引用
         return function () { // 返回包含了原函數和新函數的"代理函數"
         beforefun.apply(this, arguments); // 執行新函數,修正this
         return _orgin.apply(this, arguments); // 執行原函數
         }
        };
        
        var originFun = function(val){
         console.log('原型函數: '+val);
        }
        
        var newFun = originFun.before(function(){
         // 傳入函數調用前處理方法
         console.log('before: ' + new Date().getTime())
        })
        
        newFun("測試前置通知");
        
        // 調用結果
        // before: 1557047939699
        // 原型函數: 測試前置通知

        after(后置通知)

        與before正相反,在函數調用后執行

        Function.prototype.after = function (afterfun) {
         var _orgin = this; // 保存原函數引用
         return function () { // 返回包含了原函數和新函數的"代理函數"
         var ret = _orgin.apply(this, arguments); // 執行原函數
         afterfun.apply(this, arguments); // 執行新函數,修正this
         return ret;
         }
        };
        
        var originFun = function(val){
         console.log('原型函數: '+val);
        }
        
        var newFun = originFun.after(function(){
         // 傳入函數調用前處理方法
         console.log('after: ' + new Date().getTime())
        })
        
        newFun("測試后置通知");
        
        // 調用結果
        // 原型函數: 測試前置通知
        // after: 1557047997647

        around(環繞通知)

        在方法執行前后分別執行

        // 利用前面的before、after方法實現
        Function.prototype.around = function(beforeFun, afterFun) {
        	var _orgin = this;
        	return function() {
        	return _orgin.before(beforeFun).after(afterFun).apply(this, arguments);
        	}
        }

        3. AOP遇到修飾器

        JS在ES7的提案中終于增加了修飾器(Decorator)函數,它是用來修改類的行為,但是現在瀏覽器都不支持,需要使用Babel進行轉換,當AOP與修飾器結合后,又會給我們帶來什么呢?

        日志記錄

        通過AOP與修飾器的結合會很方便的進行日志的記錄或者函數執行時間的記錄

        class Person {
         @log
         say(nick) {
         return `hi ${nick}`;
         }
        }
        
        function log(target, name, decriptor){
         var _origin = descriptor.value;
         descriptor.value = function(){
         console.log(`Calling ${name} with `, argumants);
         return _origin.apply(null, arguments);
         };
        
         return descriptor;
        }
        
        var person = new Person();
        person.say('小明');

        判斷用戶登錄狀態

        class User {
         @checkLogin
         getUserInfo() {
         console.log('獲取用戶信息')
         }
        }
        
        // 檢查用戶是否登錄
        function checkLogin(target, name, descriptor) {
         let method = descriptor.value
         descriptor.value = function (...args) {
         // 校驗方法,假設這里可以獲取到用戶名/密碼
         if (validate(args)) {
         method.apply(this, args)
         } else {
         console.log('沒有登錄,即將跳轉到登錄頁面...')
         }
         }
        }
        
        let user = new User()
        user.getUserInfo()

        4. React中的AOP

        在react中使用AOP思想的典型就是高階組件(HOC),請看下面的例子

        function HOCComp(WrappedComponent){
         return class HOC extends Component {
         render(){
         const newProps = {param: 'HOC'};
         return <div>
         <WrappedComponent {...this.props} {...newProps}/>
         </div>
         }
         }
        }
        
        @HOCComp
        class OriginComponent extends Component {
         render(){
         return <div>這是原始組件{this.props.param}</div>
         }
        }

        上面例子中在HOCComp中定義新的props,并傳入子組件中。我們也可以對OriginComponent組件中的一些props進行加工,或對OriginComponent外層進行再次包裝。從而不必去修改內部組件,保持了功能上的解耦。

        5. 總結

        AOP思想在框架及項目中使用的很多,包括React高階組件、日志記錄、登錄驗證、redux中間件等。在開發中應該與OOP相輔相成,共同提高軟件的健壯性及可維護性。

        好了,

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript中AOP的實現與應用

        JavaScript中AOP的實現與應用:1. 簡介 AOP (Aspect Oriented Programming) ,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是函數式編程的一種衍生,利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦
        推薦度:
        標簽: 應用 實現 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本黄色免费观看| 国产AV无码专区亚洲AV漫画| 亚洲精品乱码久久久久久V| 亚洲另类春色校园小说| 亚洲另类无码专区首页| 国产高潮久久免费观看| 久久久久久久岛国免费播放| 夜夜爽免费888视频| 亚洲国产精品一区二区久久hs| 亚洲无线一二三四区| 国产精品综合专区中文字幕免费播放 | 亚洲乱码在线播放| 欧美a级成人网站免费| 亚洲A丁香五香天堂网| 亚洲小说区图片区| 黄色成人网站免费无码av| 国产精品亚洲lv粉色| 9277手机在线视频观看免费| 免费va人成视频网站全| 亚洲资源在线视频| sss日本免费完整版在线观看| 亚洲一区AV无码少妇电影☆| 久久亚洲AV成人无码国产电影 | 亚洲va在线va天堂成人| eeuss草民免费| 亚洲国产精品无码AAA片| 无码av免费毛片一区二区| 亚洲国产91精品无码专区| 国产精品九九久久免费视频| 久久青青草原亚洲AV无码麻豆 | 日韩免费高清大片在线| 亚洲人成伊人成综合网久久久| 久久国产免费一区| 亚洲乱色熟女一区二区三区丝袜| 99爱在线观看免费完整版| 亚洲国产精品成人AV在线| 亚洲AV无码专区亚洲AV伊甸园| 免费黄色一级毛片| 亚洲av无码成人精品区一本二本 | 亚洲系列国产精品制服丝袜第| 99在线视频免费观看|