1.java中有动态代理模式,es6中新引入了Proxy类
<script>
var obj={name:'ggb',course:'javascript'};
var proxy=new Proxy(obj,{
get:function(target,key){
return 'no';
},
set:function(target,key,value){
// Reflect.set(target,key,value) 1111
}
})
console.log(proxy.name);//no
proxy.name='wds';
console.log(obj.name);//ggb 2222
</script>
运行上述代码,可以看到 代理起作用了,打印proxy.name时候,调用了get方法。带式赋值并没有起作用,如果将上代码中111处解除注释,那么代理会起作用,2222处会打印 wds
加入
deleteProperty:function(target,key){
// if(key=='name'){
// }else{
// Reflect.deleteProperty(target,key)
// }
}
delete proxy.name;
console.log(proxy.name)//no
console.log(obj.name)//wds
发现代理并没有起到删除的功能,如果没有deletePropery:function(){},反倒能删除。另外也可以加入一些逻辑判断,在具体的方法中,如上段代码注释掉的地方。
2.函数代理,上面说的是对象的代理,下面说函数代理
看代码,学知识
function test(){
console.log('hello world')
}
var proxyFun = new Proxy(test,{
apply:function(target,cxt,args){
console.log(target);//test的函数体
console.log(cxt);//undefined
console.log(args)//[1,2,3]
console.log('this.........')
return Reflect.apply(target,cxt,args)
}
})
proxyFun(1,2,3);
3.构造函数的代理
function User(){
console.log('this is class')
}
var ClassProxy=new Proxy(User,{
construct:function(target,args){
console.log('this is class proxy handle')
return Reflect.construct(target,args)
}
})
new ClassProxy();
//打印结果
this is class proxy handle
this is class