当前位置: 首页 > news >正文

ES6之Proxy详解

一.什么是Proxy

   Proxy是es6新增的一个属性,用于修改某些操作的默认行为,可以理解为在目标对象外层设置一层“拦截”,外界如果想要访问目标对象,都必须先通过这层拦截,所以proxy提供了一种机制可以对外界的访问进行过滤和改写,用在这里proxy表示代理器的意思。

   Proxy通过使用一个代理对象来包装目标对象,并提供了一组钩子函数(也称为“陷阱”),这些钩子函数可以在代理对象上进行操作。当我们对代理对象进行操作时,本质上是在调用这些钩子函数。

二.Proxy用法

    在ES6中提供了Proxy构造函数,可以用这个构造函数生成Proxy实例

var proxy = new Proxy(target,handler);

在上述示例中, new Proxy()表示生成一个Proxy实例,target表示的是所要拦截的目标对象,handler是用来定制拦截行为,也是一个对象,需要向其中提供对应的处理函数,该函数将拦截对应的操作 。

三.常用Proxy属性用法

    3.1 get(target,prop,receiver)
  • 作用:用于拦截某个属性的读取操作
  • 参数:target:目标对象 ;prop:属性名;receiver:proxy实例本身(操作行为所针对的对象,改参数是可选的)
  • 示例
 var person ={name:"jack"};var proxy =new Proxy(person,{get: function(target,prop) {if(prop in target){console.log(target[prop]);}else{throw new ReferenceError("Prop name \"" + propKey + "\" does not exist.")}}})proxy.name//jackproxy.age//抛出一个错误
   3.2 set(target,prop,value,receiver)
  • 作用:用于拦截某个属性的赋值操作
  • 参数:target:目标对象;prop:属性名;value:属性值;receiver:Proxy实例本身(该参数可选)
  • 示例:
     var person ={name:'john'};var proxy =new Proxy(person,{set: function(target,prop,value){if(prop==='age'){if(value>200){throw new RangeError('不符合范围')}else{target[prop]=value;}}}})proxy.age=400//报错,不继续执行proxy.age=100//100
    
        3.3 apply(target,ctx,args) 
  • 作用:拦截函数的调用
  • 参数:target:目标对象;ctx:目标对象的上下文对象;args:目标对象的参数数组
  • 示例:
     var target= function(){return '目标对象';};var handler={apply:function(){return '代理对象';}};var p =new Proxy(target,handler);p();//代理对象
       3.4 has(target,key)
  • 作用:用来拦截HasProperty操作,判断对象是否具有某个属性
  • 参数:target:目标对象;key:需要查询的属性名
  • 示例:
     var handler={has(target,key){if(key[0]==='_'){return false}return key in target;}};var target={_prop:'jack',prop:'john' };var proxy =new Proxy(target,handler)
    由于'_prop' in proxy中,所以返回结果为false,不会被in操作符发现
          3.5 construct(target,args,newTarget)
  • 作用:用于拦截new命令
  • 参数:target:目标对象;args:构造函数的参数对象;newTarget:创建实例对象时,new命令作用的构造函数
  • 注意:construct方法返回的必须是一个对象,否则会报错
  • 示例:
    var p =new Proxy(function(){},{construct: function(target,args){console.log('called'+args.join(','));return {value:args[0]*10}}
    });
    console.log((new p(1)).value);//called1;10
          3.6 deleteProperty(target,key)
  • 作用:拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete删除
  • 参数:target:目标对象;key:要删除的属性
  • 示例:
    var handler={deleteProperty(target,key){judge(key,'delete');delete targetp[key];return true;}
    };
    function judge(key,action){if(key[0]==='_'){throw new Error('删除属性错误')}
    }
    var target={_prop:'foo'};
    var proxy = new Proxy(target,handler);
    delete proxy._prop//报错,删除属性错误
           3.7 getPropertyOf(target)
  • 作用:拦截对代理对象原型链上属性的访问操作
  • 参数:target:目标对象
  • 示例:
    const target={};
    const proxy=new Proxy(target,{getPrototypeOf(target) {console.log('get prototype');return Object.getPrototypeOf(target)}
    });
    console.log(Object.getPrototypeOf(proxy));//get prototype
            3.8 setPrototypeOf(target,prototype)
  • 作用:拦截对代理对象原型链上属性的设置操作

  • 参数:target:目标对象;prototype:要设置的原型对象

  • 示例:

     const target ={}const proxy=new Proxy(target,{setPrototypeOf(target,prototype){console.log('set prototype');return Object.setPrototypeOf(target,prototype)}})const proto= {name:'jack'}Object.setPrototypeOf(proxy,proto)//set prototypeconsole.log(proxy.name);//jack

     

 

    


http://www.mrgr.cn/news/69302.html

相关文章:

  • vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)
  • SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)
  • 【操作系统】每日 3 题(二十四)
  • 【微服务设计】分布式系统一致性:深入解析2PC(两阶段提交)和TCC的优势与劣势
  • 在uniapp中使用canvas封装组件遇到的坑,数据被后面设备覆盖,导致数据和前面的设备一样
  • 机器学习、深度学习面试知识点汇总
  • 【设计模式】行为型模式(一):模板方法模式、观察者模式
  • 详解:光伏电站前期收资
  • 浮动路由:实现出口线路的负载均衡冗余备份。
  • C转DP线 单向 双向选择
  • 软考错题分析1109
  • QJson-趟过的各种坑(先坑后用法)
  • react的创建与书写
  • Java 的 Scanner 类:控制台输入与文件扫描
  • 第 1 章 - Go语言简介
  • 软考:论容器编排
  • 介绍一下数组(c基础)(详细版)
  • 2024年3月电子学会Python等级考试试卷(五级)真题,包含答案
  • DirectShow过滤器开发-写AVI视频文件过滤器
  • C++builder中的人工智能(16):神经网络中的SoftPlus激活函数
  • ubuntu24.04安装matlab失败
  • Rust为什么要搞个match匹配,直接用==判断不行吗(Rust match、Rust ==、Rust模式匹配)
  • vue2 和 vue3的区别
  • Mac 安装protobuf2.5.0
  • 【竞技宝】LOL:JKL回归IG已无可能?
  • 对于app开发者对接广告联盟,需要哪些资质以及变现如何?