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)
来完成代理和切面。