由於功能上的需求,需要在js的N個方法前執行一些判斷代碼,M個方法後執行處理代碼。如果直接將代碼寫在具體方法裡面增加處理代碼,那會導致代碼很難維護。對於這個需求,當時想到有2種解決方案。
1.新建一個抽象類,統一入口,然後在入口再分發到具體的方法。但需要對源代碼進行不少改動。而且如何分發也是一些問題,如方法參數不一。所以就沒堅持這種方案。
2.搬照spring的AOP編程。最後發現是可以實現的。
網上找了一些資料,修改整理了一個util類
Js代碼
/*
aop工具類
onedear 2011-06-10
*/
var AOPUtil = {
/*
className:個人稱之為作用域,也可稱之為類名
fnName:方法名,字符串類型
beforeFn:before function
*/
before : function (className , fnName , beforeFn) {
if(typeof(className) == 'function')
className = className.prototype ;
if(typeof(className[fnName]) != 'function')
return ;
if(typeof(beforeFn) != 'function')
return ;
var target = className[fnName] ;
className[fnName] = function () {
beforeFn.apply(this,arguments);
return target.apply(this, arguments);
}
},
beforeJudge : function (className , fnName , beforeFn) {
if(typeof(className) == 'function')
className = className.prototype ;
if(typeof(className[fnName]) != 'function')
return ;
if(typeof(beforeFn) != 'function')
return ;
var target = className[fnName] ;
className[fnName] = function () {
var result = beforeFn.apply(this,arguments);
if(!result)
return ;
return target.apply(this, arguments);
}
},
//同上
after : function (className , fnName , afterFn ) {
if(typeof(className) == 'function')
className = className.prototype ;
if(typeof(className[fnName]) != 'function')
return ;
if(typeof(afterFn) != 'function')
return ;
var target = className[fnName] ;
className[fnName] = function () {
var returnValue = target.apply(this, arguments);
afterFn.apply(this,arguments);
return returnValue;
}
}
};
調用sample
Js代碼
function before(){
alert("before");
}
function after() {
alert("after");
}
本人習慣的方法定義有這麼幾種:
1.handle = {
testHandle : function() {
alert("testHandle");
}
}
則調用方法為
AOPUtil.before(window.handle,"testHandle" , after);
2.function test2() {
alert("test2");
}
則調用方法為:
AOPUtil.before(window,"test2" , before);
3.var t = function(){};
t.prototype.test = function(param1 , param2) {
alert(param1+"_"+param2);
}
則調用方法為:
AOPUtil.before(t, "test" , before);
js還有其他方法定義否?