高阶函数实现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

代码是一种神奇的东西,咱们能够驱动它干好多事情。为何咱们很差好作一个控制者呢!! 函数

相关文章
相关标签/搜索