程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> aop在js的實現

aop在js的實現

編輯:關於JSP

由於功能上的需求,需要在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還有其他方法定義否?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved