当前位置 : 主页 > 网络编程 > JavaScript >

javascript 如何实现动态代理

来源:互联网 收集:自由互联 发布时间:2021-07-03
最近正在研究javascript如何实现动态代理,目前实现了部分思想,但是离真正的动态代理还差那么一点, 想看看各位有没有更好的办法。 1. [代码] [JavaScript]代码 var objectProxy={create:funct
最近正在研究javascript如何实现动态代理,目前实现了部分思想,但是离真正的动态代理还差那么一点,
想看看各位有没有更好的办法。

1. [代码][JavaScript]代码    

var objectProxy={
		create:function(target,methodHandler){
			if(!(target instanceof Object)){
				throw new Error("target argument is not object type!");
			}
			var isFunction = function(o){
				return (o instanceof Function);
			}
			if(!(methodHandler instanceof Object)){
				throw new Error("methodHandler is not a valid object!");
			}
			//前置 后置 错误 返回 四个处理器
			if(!methodHandler.before && !methodHandler.after && !methodHandler.error && !methodHandler.returing){
				return target;
			}
			var proxy = {};
			for(var i in target){//获取对象属性方法
				var targetPrototype = target[i];
				if(isFunction(targetPrototype)){
					var process = true;
					if(methodHandler.filter)
						process = methodHandler.filter(i);
					if(process){
						proxy[i] = function(){
							var args = {name:i,args:arguments};
							if(methodHandler.before)methodHandler.before.call(target,args);//执行前置处理
							var result = null;
							try{
								result = targetPrototype(arguments);
								args["result"] = result;//设置返回值
								if(methodHandler.after)methodHandler.after.call(target,args);//执行后置处理
							}catch(e){
								args["error"] = e;//设置异常信息
								if(methodHandler.error)methodHandler.error.call(target,args);//执行异常处理
							}
							if(methodHandler.returing)
								result = methodHandler.returing.call(target,args);//执行返回处理
							return result;
						}
					}
				}
			}
			return proxy;
		}
};
window.onload=function(){
	var proxy = {prop:"prop name!",func:function(){
		alert("process ...!");
		return "test proxy!";
	}};
	var methodHandler = {
			filter:function(name){//过滤方法 (true|false) false 表示不处理
			   return true;
			},
			before:function(args){//前置
				alert("before methodHandler name : "+args.name);
			},
			after:function(args){//后置
				alert("after methodHandler name : "+args.name+",return : "+args.result);
			},
			error:function(args){//错误
				alert("error methodHandler name : "+args.name+",error : "+args.error);
			},
			returing:function(args){//返回
				alert("returing methodHandler name : "+args.name+",error : "+(args.error?args.error:null)+",return : "+args.result);
				return "changed : "+args.result;
			}
		};
	proxy = objectProxy.create(proxy,methodHandler);
	proxy.func();
}
网友评论