aop在js的实现

由于功能上的需求,需要在js的N个方法前执行一些判断代码,M个方法后执行处理代码。如果直接将代码写在具体方法里面增加处理代码,那会导致代码很难维护。对于这个需求,当时想到有2种解决方案。
    1.新建一个抽象类,统一入口,然后在入口再分发到具体的方法。但需要对源代码进行不少改动。而且如何分发也是一些问题,如方法参数不一。所以就没坚持这种方案。
    2.搬照spring的AOP编程。最后发现是可以实现的。
    网上找了一些资料,修改整理了一个util类

/*
			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

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还有其他方法定义否?


资料参考:
http://www.w3cschool.cn/pro_js_inheritance_implementing.html
http://zhaohengzhan.blog.163.com/blog/static/255044432010214390711/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值