ES6系列之代理

一,代理概述

代理的兼容性

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值