JavaScript 高级函数实现AOP

日期: 2017-07-25         浏览量: 2662

AOP (面向切面编程) 的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能模块通常包括日志统计,安全控制,异常处理等。把这些功能抽离出来后,在通过 “动态植入” 的方式掺入业务逻辑模块中。这样做的好处首先是可以保持业务逻辑模块的纯净和高内聚性,其次是方便地复用日志统计等功能模块。


通常在 JavaScript 中实现 AOP,都是把指把一个函数 “动态植入” 到另一个函数中,具体实现的方法很多,我们通过扩展 Function.prototype 来做到这一点。


//在需要执行的函数之前执行某个新添加的功能函数

Function.prototype.before = function( beforefn){

    var _self = this;     //保存原函数引用

   //返回包含了原函数和新函数的代理函数

     return function(){

        beforefn.apply( this , arguments );     //执行新函数,且保证this不被劫持,新函数接受的参数

        return  _self.apply(_self,arguments);   // 也会被原封不动的传入旧函数,新函数在旧函数之前执行

    }

}


//在需要执行的函数之后执行某个新添加的功能函数

Function.prototype.after = function( afterfn ){

    var _self = this;

    return function(){

        var ret = _self.apply( this , arguments);

        afterfn.apply(this, arguments);

        return ret;

    }

}


var func = function(){

    console.log(2);

}


func = func.before(function(){

    console.log(1);

}).after(function(){

    console.log(3);

})

func();    //输出  123;


这种使用AOP的方式来给函数添加职责,也是JavaScript语言中一种非常特别和巧妙的装饰者模式实现。