最近正在研究javascript如何实现动态代理,目前实现了部分思想,但是离真正的动态代理还差那么一点, 想看看各位有没有更好的办法。 1. [代码] [JavaScript]代码 var objectProxy={create:funct
想看看各位有没有更好的办法。
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(); }