javascript的代理和切面

itclkang 2014-05-15

Java里有面向切面的实现方式,可以监控包、对象、函数等的行为,以及动态修改函数的参数和返回值等。

那么在JavaScript里是否有对应实现?在用到对一个函数进行切面时,如何监控函数的参数

和执行过程,以及修改函数的执行方式。

在用jasmine对代码进行测试时,jasmine使用了一个很优雅的方式,使用spyOn对函数进行监控。虽然没有看过jasmine的源代码,但时,spyOn函数修改了函数的默认行为。受此启发,JavaScript里是可以实现切面操作的。

实现方式:

/**
 * 原函数
 * @param {type} val
 * @returns {Number}
 */

function fun(val){
        return val+1;
    }


/**
 * 注册前置函数
 * @returns {undefined}
 */
function before(){
    var f = fun;
    window.fun = function(val){  
        //修改参数
        val = val+2;
        
        //执行原函数
       return f(val); 
    };
}

//注册
before(); 

//执行
var rst = fun(1);


console.log(rst);
结果输出:4

实际在应用中,我们可以将代理和切面功能完善一下,给出一个完善的方法,如

/**
 * 
 * @param {type} fun 原函数
 * @param {type} obj fun所属的对象
 * @param {type} before 前置函数
 * @param {type} after  后置函数
 */


function proxy(fun,obj,before,after)

来完成代理和切面。

相关推荐