一,代理概述
代理的兼容性
proxy
在目标对象的外层建造了一层拦截,外部对目标对象的某些操作,必须通过这层拦截
var proxy = new Proxy(目标,处理程序);
|
new Proxy()
表示生成一个Proxy
实例,target
参数表示所要拦截的目标对象,handler
参数也是一个对象,使用定制拦截行为
var target = {
name:'poetries'
}; var logHandler = {
get:function(target,key){
console .log(` $ {key}被读取`);
返回目标[键];
},set:function(target,key,value){
console .log(` $ {key}被设置为$ {value} `);
target [key] =值;
} } VAR targetWithLog = 新代理(目标,logHandler);
targetWithLog.name; //控制台输出:name被读取
targetWithLog.name =
“其他”;//控制台输出:名称被设置为其他控制台 .LOG(target.name); //控制台输出:其他
|
targetWithLog
读取属性的值时,实际上执行的是logHandler.get
:在控制台输出信息,并读取被代理对象target
的属性。- 在
targetWithLog
设置属性值时,实际上执行的是logHandler.set
:在控制台输出信息,并且设置被代理对象target
的属性的值
// //由于拦截函数总是返回35,所以访问任何属性都得到35
var proxy = new Proxy({},{ get:function(target,property){ return 35 ; } });
proxy.time // 35
proxy.name // 35
proxy.title // 35
|
代理实例也可以作为其他对象的原型对象
var proxy = new Proxy({},{
get:function(target,property){
return 35 ; } });
让 obj = Object .create(proxy);
obj.time // 35
|
proxy
对象是obj
对象的原型,obj
对象本身并没有time
属性,所以根据原型链,会在proxy
对象上读取该属性,导致被拦截
代理人的作用
对于代理模式
Proxy
的作用主要体现在三个方面
- 拦截和监视外部对对象的访问
- 降低函数或类的复杂度
- 在复杂操作前对操作进行校正或对所需资源进行管理
二,Proxy所能代理的范围–handler
实际上
handler
本身就是ES6
所新设计的一个对象。它的作用就是用来自定义代理对象的各种可代理操作。它本身一共有13
中方法,其中方法都可以代理一种操作。其13
种方法如下
//在读取代理对象的原型时触发该操作,并在执行Object.getPrototypeOf(proxy)时
。handler.getPrototypeOf()
//在设置代理对象的原型时触发该操作,并在执行Object.setPrototypeOf(proxy,null)时
。handler.setPrototypeOf()
//在判断一个代理对象是否是可扩展时触发该操作,例如在执行Object.isExtensible(proxy)时
。handler.isExtensible()
//在让一个代理对象不可扩展时触发该操作,并在执行Object.preventExtensions(proxy)时。handler.preventExtensions
()
//在获取代理对象某个属性的属性描述时触发该操作,然后在执行Object.getOwnPropertyDescriptor(proxy,“ foo”)时
。handler.getOwnPropertyDescriptor()
//在定义代理对象某个属性时的属性描述时触发该操作,例如在执行Object.defineProperty(proxy,“ foo”,{})时
。andler.defineProperty()
//在代理服务器时是否判断代理对象是否拥有某个属性时触发该操作,并在其中执行“ foo”
。handler.has()
//在读取代理对象的某个属性时触发该操作,并在其中执行proxy.foo时。handler.get
()
//在给代理对象的某个属性赋值时触发该操作,例如在执行proxy.foo = 1时。handler.set
()
//在删除代理对象的某个属性时触发该操作,并在其中执行delete proxy.foo时。handler.deleteProperty
()
//在获取代理对象的所有属性键时触发该操作,并在执行Object.getOwnPrope |