• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

    主要功能

  • 日志記錄
  • 性能統計
  • 安全控制
  • 事務處理
  • 異常處理等等。
  • 主要意圖

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

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

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

    2.AOP在JS中的實現原理

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

  • apply函數
  • 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在數據庫方面的應用

  • 記錄sql的執行記錄(AOP的前置通知)
  • 記錄sql的執行時間(AOP的環繞通知)
  • sql執行完后自動釋放連接(AOP的環繞通知)
  • 本人基于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
    主站蜘蛛池模板: 国产成人亚洲精品青草天美| 无码精品久久久久久人妻中字 | 青青草原精品99久久精品66| 综合在线视频精品专区| 午夜精品乱人伦小说区| 国产精品美女久久久久AV福利| 久久久亚洲精品蜜桃臀| 最新国产精品精品视频| 精品久久久久中文字幕日本| 国产精品莉莉欧美自在线线| 国产VA免费精品高清在线| 日本精品一区二区三区在线视频一 | 精品欧洲av无码一区二区三区| 日本一区二区三区精品国产 | 亚洲国产精品尤物YW在线观看| 日韩AV无码精品人妻系列| 青草青草久热精品视频在线观看| 人妻熟妇乱又伦精品视频| 久久这里只有精品视频99| 国产精品国产三级国产| 日本久久久精品中文字幕| 精品精品国产高清a毛片牛牛| 91精品免费久久久久久久久| 欧美精品亚洲日韩aⅴ| 国产精品成人小电影在线观看| 欧美精品天天操| 国产精品视频一区二区三区 | 精品人妻中文字幕有码在线| 麻豆国产在线精品国偷产拍| 亚洲精品无码高潮喷水在线| 久久精品国产99国产电影网| 精品成在人线AV无码免费看 | 亚洲精品色婷婷在线影院| 亚洲国产人成精品| 最新精品亚洲成a人在线观看| 亚洲国产主播精品极品网红| 合区精品中文字幕| 综合国产精品第一页| 亚洲AV成人精品一区二区三区| 无码人妻精品一区二区三区夜夜嗨 | 精品国际久久久久999波多野 |