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
代碼是一種神奇的東西,咱們能夠驅動它幹好多事情。爲何咱們很差好作一個控制者呢!! 函數