高階函數實現AOP

簡介

AOP(面向切面程序)的主要做用是把一些跟核心業務邏輯模塊無關的功能抽離出來,這些跟業務邏輯無關的功能一般包括日至統計、安全控制、異常處理等。把這些功能抽離出來以後,再經過「動態織入」的方式摻入業務邏輯模塊中。這樣作的好處首先是能夠保證業務邏輯模塊的純潔和高內聚性,其次是能夠很方便的複用日誌統計模塊。在JavaScript中實現AOP,都是隻把一個函數「動態織入」到另外一個函數之中,具體實現技術不少,如今來實現一個。ajax

面向切面程序

Function.prototype.before=function(beforefn){
    var self=this;//保存原函數的引用
    return function(){//返回包含了原函數和新函數的「代理」函數
        beforefn.apply(this,arguments);//執行新函數,修正this
        return self.apply(this,arguments);//執行原函數
    }
}
Function.prototype.after=function(afterfn){
    var self=this;//保存原函數的引用
    return function(){//返回包含了原函數和新函數的「代理」函數
        var ret=self.apply(this,arguments);//執行原函數
        afterfn.apply(this,arguments);//執行新函數,修正this
        return ret;
    }
}

var fn=function(){
    console.log("fn");
}
fn=fn.before(function(){
    console.log("before");
}).after(function(){
    console.log("after");
});

fn();複製代碼

使用場景

AOP(面向切面程序)使用的場景仍是不少的,那最簡單例子來講,如今小明入職剛剛入職,以前他們寫的代碼小明還沒時間看,如今呢!要小明實現一個form表單提交前驗證。小明看了看以前的驗證規則,是一個很大的函數,內部代碼混亂不堪,無從下手,甚至不知道修改了會不會影響其餘功能。如今AOP(面向切面程序)就給咱們提供了方便。下面我給你們演示一下怎麼使用。安全

Function.prototype.before=function(beforefn){
    var self=this;//保存原函數的引用
    return function(){//返回包含了原函數和新函數的「代理」函數
        if(beforefn.apply(this,arguments)){
            return self.apply(this,arguments);//執行原函數
        };//執行新函數,修正this
    }
}

var fn=function(){
    console.log("form表單提交");
}
fn=fn.before(function(){
    if(1==1){
        console.log("驗證經過");
        return true;
    }else{
        console.log("驗證失敗");
        return false;
    }

})

fn();複製代碼

能夠看出,咱們不須要知道你這個函數內容是什麼。咱們只關心咱們寫的代碼,用戶提交的數據是否正確。bash

簡單方式實現AOP(面向切面程序)

function ajax(){
     console.log("fajax提交");
}
var ajaxfn=ajax;//把ajax函數引用保存起來。
var ajax=function (){//從新ajax函數;
    if(1==1){
        console.log("驗證經過");
    }else{
        return false;
    }
    //先驗證上邊代碼在執行ajax提交
    ajaxfn();
}
ajax();複製代碼

總結

AOP(面向切面程序)在實際應用中仍是很普遍。但願上邊的方法可以幫助你寫出更爲簡潔的代碼處理複雜的業務。若是有不對的地方但願你們指出。app

代碼是一種神奇的東西,咱們能夠驅動它幹好多事情。爲何咱們很差好作一個控制者呢!! 函數

相關文章
相關標籤/搜索