AOP(面向切面程序)的主要做用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能一般包括日至统计、安全控制、异常处理等。把这些功能抽离出来以后,再经过“动态织入”的方式掺入业务逻辑模块中。这样作的好处首先是能够保证业务逻辑模块的纯洁和高内聚性,其次是能够很方便的复用日志统计模块。在JavaScript中实现AOP,都是只把一个函数“动态织入”到另外一个函数之中,具体实现技术不少,如今来实现一个。ajax
Function.prototype.before=function(beforefn){
var self=this;//保存原函数的引用
return function(){//返回包含了原函数和新函数的“代理”函数
beforefn.apply(this,arguments);//执行新函数,修正this
return self.apply(this,arguments);//执行原函数
}
}
Function.prototype.after=function(afterfn){
var self=this;//保存原函数的引用
return function(){//返回包含了原函数和新函数的“代理”函数
var ret=self.apply(this,arguments);//执行原函数
afterfn.apply(this,arguments);//执行新函数,修正this
return ret;
}
}
var fn=function(){
console.log("fn");
}
fn=fn.before(function(){
console.log("before");
}).after(function(){
console.log("after");
});
fn();复制代码
AOP(面向切面程序)使用的场景仍是不少的,那最简单例子来讲,如今小明入职刚刚入职,以前他们写的代码小明还没时间看,如今呢!要小明实现一个form表单提交前验证。小明看了看以前的验证规则,是一个很大的函数,内部代码混乱不堪,无从下手,甚至不知道修改了会不会影响其余功能。如今AOP(面向切面程序)就给咱们提供了方便。下面我给你们演示一下怎么使用。安全
Function.prototype.before=function(beforefn){
var self=this;//保存原函数的引用
return function(){//返回包含了原函数和新函数的“代理”函数
if(beforefn.apply(this,arguments)){
return self.apply(this,arguments);//执行原函数
};//执行新函数,修正this
}
}
var fn=function(){
console.log("form表单提交");
}
fn=fn.before(function(){
if(1==1){
console.log("验证经过");
return true;
}else{
console.log("验证失败");
return false;
}
})
fn();复制代码
能够看出,咱们不须要知道你这个函数内容是什么。咱们只关心咱们写的代码,用户提交的数据是否正确。bash
function ajax(){
console.log("fajax提交");
}
var ajaxfn=ajax;//把ajax函数引用保存起来。
var ajax=function (){//从新ajax函数;
if(1==1){
console.log("验证经过");
}else{
return false;
}
//先验证上边代码在执行ajax提交
ajaxfn();
}
ajax();复制代码
AOP(面向切面程序)在实际应用中仍是很普遍。但愿上边的方法可以帮助你写出更为简洁的代码处理复杂的业务。若是有不对的地方但愿你们指出。app
代码是一种神奇的东西,咱们能够驱动它干好多事情。为何咱们很差好作一个控制者呢!! 函数