<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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        關于AOP在JS中的實現與應用詳解

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

        關于AOP在JS中的實現與應用詳解

        關于AOP在JS中的實現與應用詳解:1.AOP介紹 簡介 AOP (面向切面編程),縮寫為Aspect Oriented Programming,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是JAVA 中Spring框架的一個重要內
        推薦度:
        導讀關于AOP在JS中的實現與應用詳解:1.AOP介紹 簡介 AOP (面向切面編程),縮寫為Aspect Oriented Programming,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是JAVA 中Spring框架的一個重要內

        1.AOP介紹

        簡介

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

        主要功能

      1. 日志記錄
      2. 性能統計
      3. 安全控制
      4. 事務處理
      5. 異常處理等等。
      6. 主要意圖

        將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。

          注:請慎重的在JS的中使用AOP!因為部分JS的方法是異步的。 

          必要時使用ES7中的async/await/Promise,以保證代碼的順序執行。

        2.AOP在JS中的實現原理

        js中aop的實現原理主要依靠Function的兩個函數:apply和call。

      7. apply函數
      8. Function.apply(obj, args);

        apply方法能劫持另外一個對象的方法,繼承另外一個對象的屬性

        Function.apply(obj, args)方法能接收兩個參數

        obj:這個對象將代替Function類里this對象

        args:這個是數組,它將作為參數傳給Function(args–>arguments)

        利用Function.apply()的參數數組化來提升程序的性能

        示例:

        function dosomething(a,b,c){
         console.log('do something.', a, b, c);
         // 預期結果: do something. see say run
        }
        
        let something = ['see', 'say', 'run'];
        dosomething.apply(this, something);

        call函數

        Function.call(obj, arg, arg, ...);1

        示例:

        function dosomething(a,b,c){
         console.log('do something.', a, b, c);
         // 預期結果: do something. see say run
        }
        
        dosomething.call(this, 'see', 'say', 'run');

          推薦:使用apply函數。call函數和apply函數的效果是一樣,但是call函數的參數不夠靈活,在寫法上參數無法靈活伸縮;apply函數,只需要把參數放到數組里即可。apply比call函數更適合在項目實際開發中使用,并且apply比call的性能要好。

        3.AOP在JS中的實現

        從事過Java Web開發的童鞋,一定用過Spring框架。在Spring的框架中有before(前置通知)、after(后置通知)、around(環繞通知)。

        今天我們在JS中實現的這三種通知。

        1. before(前置通知)

        before函數,用來實現函數的前置通知。在目標函數的前面執行一些前置操作。

        // AOP 前置通知函數聲明
        /**
         * 給方法加入前置切片函數
         * 可以在執行方法之前執行一些操作,
         * 前置切片的返回值為false時,不影響原方法的執行
         * @param func {Function} 被前置執行的函數
         * @return {Function} 加入前置通知的函數
         */
        Function.prototype._before = function(func){
         var __self = this;
         return function(){
         func.apply(__self, arguments);
         return __self.apply(__self, arguments);
         }
        }
        
        // 代碼
        function a(){
         console.log('I\'m a');
        }
        
        a = a._before(function(){
         console.log('before');
        });
        
        a();
        // 結果:
        // before
        // I'm a

        2. after(后置通知)

        after函數,用來實現函數的后置通知。在目標函數的后面面執行一些后置操作。

        // AOP 后置通知函數聲明
        /**
         * 給方法加入后置切片函數
         * 可以在執行方法之之后執行一些操作
         * 后置切片的返回值為false時,不影響原方法的執行
         * @param func {Function} 被后置執行的函數
         * @return {Function} 加入后置通知的函數
         * @constructor
         */
        Function.prototype._after = function(func){
         var __self = this;
         return function(){
         var ret = __self.apply(__self, arguments);
         func.apply(__self, arguments);
         return ret;
         }
        }
        
        // 代碼
        function b(){
         console.log('I\'m b');
        }
        
        b = b._after(function(){
         console.log('after');
        });
        
        b();
        // 結果:
        // I'm b
        // after

        3. around(環繞通知)

        在around函數中,引入了一個JoinPoint對象。JoinPoint對象封裝了目標函數和目標函數的參數。在調用JoinPoint對象的invoke函數時,會去調用原來的目標函數。在調用invoke時,如果需要改變目標函數的this對象,需要將對象傳入到invoke的參數中。around函數,可以在目標函數的前面和后面隨意加入邏輯代碼,也可以根據條件判斷是否執行目標函數。

        // AOP 環繞通知函數聲明
        /**
         * 切入點對象
         * 不允許切入對象多次調用
         * @param obj 對象
         * @param args 參數
         * @constructor
         */
        function JoinPoint(obj, args){
         var isapply = false; // 判斷是否執行過目標函數
         var result = null; // 保存目標函數的執行結果
        
         this.source = obj; // 目標函數對象
         this.args = args; // 目標函數對象傳入的參數
        
         /**
         * 目標函數的代理執行函數
         * 如果被調用過,不能重復調用
         * @return {object} 目標函數的返回結果
         */
         this.invoke = function(thiz){ 
         if(isapply){ return; }
         isapply = true;
         result = this.source.apply(thiz || this.source, this.args);
         return result;
         };
        
         // 獲取目標函數執行結果
         this.getResult = function(){
         return result;
         }
        }
        
        /**
         * 方法環繞通知
         * 原方法的執行需在環繞通知方法中執行
         * @param func {Function} 環繞通知的函數
         * 程序會往func中傳入一個JoinPoint(切入點)對象, 在適當的時機
         * 執行JoinPoint對象的invoke函數,調用目標函數
         * 
         * @return {Function} 切入環繞通知后的函數,
         */
        Function.prototype._around = function(func){
         var __self = this;
         return function(){
         var args = [new JoinPoint(__self, arguments)];
         return func.apply(this, args);
         }
        }
        
        // 代碼
        
        var isAdmin = true;
        
        function c(){
         console.log('show user list');
        }
        
        c = c._around(function(joinpoint){
         if(isAdmin){ // 滿足條件時,執行目標函數
         console.log('is admin');
         joinpoint.invoke(this);
         }
        });
        
        c();
        // 結果
        // if isAdmin == true
        // is admin
        // show user list
        // if isAdmin == false
        // 

        4.AOP在JS中的應用

        AOP在數據庫方面的應用

      9. 記錄sql的執行記錄(AOP的前置通知)
      10. 記錄sql的執行時間(AOP的環繞通知)
      11. sql執行完后自動釋放連接(AOP的環繞通知)
      12. 本人基于NodeJS寫了一個關系型數據庫持久層框架——Ebatis。在Ebatis中,使用了AOP思想,完美解決了對sql執行記錄,性能等信息的監控,并且可以自動釋放連接。

        有興趣的可以使用我寫的Ebatis框架。

        Ebatis相當于Java上的Mybatis,像mybatis一樣,支持動態sql,支持事務,配置簡單。目前只支持Mysql數據庫,后續兼容 Postgresql,SqlServer,Sqlite 等其他關系型數據庫。

        GitHub地址 :https://github.com/muzin/ebatis

        或者

        Npm地址:https://www.npmjs.com/package/ebatis

        或者

        npm install ebatis1

        后續,加入AOP在JS中的應用的示例代碼~~~

        就先到這~

        總結

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

        文檔

        關于AOP在JS中的實現與應用詳解

        關于AOP在JS中的實現與應用詳解:1.AOP介紹 簡介 AOP (面向切面編程),縮寫為Aspect Oriented Programming,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是JAVA 中Spring框架的一個重要內
        推薦度:
        標簽: 中的 應用 實現
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产夜色在线观看| 国产精品成人免费一区二区| 亚洲人成色777777精品| 亚洲不卡中文字幕| 最新国产精品亚洲| 国产成人高清亚洲一区久久| 亚洲另类无码一区二区三区| 色欲国产麻豆一精品一AV一免费 | 男女超爽刺激视频免费播放 | 午夜亚洲国产理论片二级港台二级| 免费无码又爽又黄又刺激网站| 日韩一级片免费观看| 日本在线免费播放| 成年美女黄网站18禁免费| 亚洲午夜激情视频| 亚洲伦理一区二区| 亚洲中文字幕久久无码| 成人妇女免费播放久久久| 免费v片在线观看视频网站| 国产成人aaa在线视频免费观看| 国产在线观看www鲁啊鲁免费| 一本色道久久综合亚洲精品蜜桃冫| 最近中文字幕mv免费高清视频8| 国产成人免费片在线观看| 亚洲欧美日韩国产精品一区| 日韩一区二区免费视频| 亚洲国产综合精品中文第一区 | 国产精品99爱免费视频| 美女裸身网站免费看免费网站| 亚洲啪啪免费视频| 成人毛片免费网站| 黄页网站在线免费观看| 成人免费视频77777| 亚洲视频精品在线| 无码人妻精品中文字幕免费东京热| 亚洲成人影院在线观看| 亚洲一级特黄特黄的大片| 久久综合国产乱子伦精品免费| 国产成人免费a在线视频色戒 | 久久亚洲精品无码网站| 亚洲中文字幕无码久久精品1|