欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

aop在js的实现

程序员文章站 2022-05-08 10:10:48
由于功能上的需求,需要在js的N个方法前执行一些判断代码,M个方法后执行处理代码。如果直接将代码写在具体方法里面增加处理代码,那会导致代码很难维护。对于这个需求,当时想到有2...

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