业务场景:原有业务逻辑已经封装好,现如今需要在现有逻辑上增加逻辑处理。
实现分析:该业务场景类似于java的AOP,我们可以通过javascript中的call与apply方法实现。
代码:?
var func1 = function(arg){
console.info(‘this is func1 ‘ + arg);
}
var func2 = function(arg){//先执行func2中的代码,在执行func1中的代码
console.info(‘this is func2‘);
arg.call(this,‘test‘);
}
var func3 = function(arg){//先执行func3中的代码,再执行func1中的代码
console.info(‘this is func3‘);
arg.apply(this,[‘test‘]);
}
//调用新方法
func2(func1);
func3(func1);
?
?这里需要注意call与apply方法传参的方式。通过以上代码,我们可以看到在执行方法func1时,我们增加了其他的处理逻辑。
上边例子不带直观,举一个实际的应用。
开发web应用,免不了使用AJAX技术。也会经常用到jquery框架。在jquery框架中已经有封装好的ajax调用方法。
jquery中的ajax方法示例:
$.ajax({
url : url,
dataType : ‘json‘,
type : ‘post‘,
data : {a : ‘a‘, b : ‘b‘},
success : function(result){
checkSession(result);
1.业务逻辑1
2.业务逻辑2
//执行业务逻辑代码
}
});
?
?在回调函数中编写业务逻辑时,避免不了有相同的业务逻辑,最常见的就是对session的判断。为了避免每次使用$.ajax都要编写调用checkSession代码,我们可以将这个方法封装以下
$.extend({
/**
* 封装jquery的ajax方法,
* 传入参数为以下格式
* arg : {url : url, data : data, func : function}
* url : 将会自动添加baseUrl
* data: 请求参数, 格式为:{param :param}
* func : 回调处理方法 格式为 function(result){}
* @param arg
*/
ajaxPost : function(arg){
$.ajax({
url : baseUrl + ‘/‘ +arg.url,
type : ‘post‘,
dataType : ‘json‘,
data : arg.data,
success : function(result){
checkSession(result);//检查session
arg.func.call(this,result);
}
});
}
});
?
?我们可以使用ajaxPost方法来代替ajax方法(这里只封装了post类型),并且不用在每次请求时再手动的编写checkSession代码。
这只是call与apply应用的一个小例子,一般在框架中会经常出现call与apply。
?
原文:http://daxingzsh.iteye.com/blog/2245106