最近正在研究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();
}
