使用Function.prototype实现一个AOP

AOP应用比较广泛,在如今最为火热spring框架中,里面就用到了DI(依赖注入)和AOP(面向切面编程),那么js中可以通过什么方法来是实现AOP呢

AOP的特点是什么,为什么要使用它呢?很简单,它的主要思想是将一些与核心业务逻辑模块无关的功能分离开来,比如,我们经常会使用到日志统计,安全控制,异常处理,为了在保证到主业务的纯净和程序的高内聚,我们通过将一些附加的功能模块"动态植入"到逻辑模块中

下面我向大家介绍一下如何通过Function.prototype来实现AOP编程

//业务主模块
var myFun = function(){
    console.log("执行业务逻辑");
}

//业务主模块预处理
Function.prototype.before = function(fn){
    var _this=this; 
    return function(){
        fn.apply(this,arguments); 
        return _this.apply(this,arguments) 
    }
}

//业务主模块后处理

Function.prototype.after = function(fn){
    var _this = this;
    return function(){
        var result = _this.apply(this, arguments);
        fn.apply(this,arguments)
        return result;
    }
}

var fun =  myFun.before(function(){
    
    console.log("模块的预处理");

}).after(function(){

    console.log("模块的后处理");

});

fun();

 

代码分析:

//业务主模块
var myFun = function(){
    console.log("执行业务逻辑");
}

//业务主模块预处理
Function.prototype.before = function(fn){
    var _this=this;   //用于保存调用before方法的实例对象,此处的this指向了myFun
    return function(){  //把对函数的预处理与函数一封装在一个函数中,并返回,用于调用after函数.
        fn.apply(this,arguments);  //用于执行对模块的预处理函数fn
        return _this.apply(this,arguments)  //返回 myFun函数
    }

}

//业务主模块后处理

Function.prototype.after = function(fn){
    var _this = this;  //此处的this指向before函数返回的函数,并使用_this存储下来(也就是上面蓝色标记的函数代码)
    return function(){ //再次把before函数返回的函数与对函数的后处理封装在一个函数中,并返回
        var result = _this.apply(this, arguments);  //执行before函数的返回函数,返回值就是(return                                                                                                                                _this.apply(this,arguments)返回的值)
        fn.apply(this,arguments)  //用于执行对模块的后处理函数fn

        return result;
    }

}

var fun =  myFun.before(function(){
    
    console.log("模块的预处理");

}).after(function(){

    console.log("模块的后处理");

}); // 

fun();

 

 

总结:

可能有点绕来绕去的,但是只要仔细思考,你一定会体会到其中的巧妙之处,简而言之,就是把一个对函数的预处理封装在一个before函数中,并把预处理函数和原函数返回,作为一个函数来对after的调用(因为Function上的prototype方法,所有的函数都可以调用).

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值