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