ES6 Reflect 与 Proxy

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。

 

1、Proxy 

Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Proxy基本用法:

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。
Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”

let pro = new Proxy(target,handler);
其中 new Proxy相当于创建了一个Proxy实例,target为所要拦截的目标对象,handler也是一个对象,里面定义的是对拦截对象所要进行的拦截方法

复制代码
<script type="text/javascript">
  //Proxy
  let target = {name:'rdb',pwd:123456}
  let handler = {
      get:function(target,propKey){
            return target[propKey];
      }
  }
  let pro = new Proxy(target,handler);
  console.log(pro.name,pro.pwd); //rdb 123456
</script>
复制代码

Proxy常用的拦截方法

(1)get(target, propKey, receiver):拦截对象属性的读取,第一个参数为目标对象,第二个参数为属性名称,第三个属性为操作所针对的对象(可选参数)。

复制代码
<script type="text/javascript">
  //Proxy
  let target = {name:'rdb',pwd:123456}
  let handler = {
      get:function(target, propKey, receiver){
            if(propKey in target){
                console.log("success");
            }else{
                console.log("false");
            }
          return Reflect.get(target, propKey, receiver);
      }
  }
  let pro = new Proxy(target,handler);
  console.log(pro.name,pro.pwd); //rdb 123456
</script>
复制代码

(2)set(target, propKey, value, receiver):拦截对象属性的设置,第一个参数为目标对象,第二个参数为属性名,第三个参数为属性值,第四个参数为操作行为所针对的对象(可选参数)。

复制代码
<script type="text/javascript">
  //Proxy
  let target = {name:'rdb',pwd:123456}
  let handler = {
      get:function(target, propKey, receiver){
            if(propKey in target){
                console.log("success");
            }else{
                console.log("false");
            }
          return Reflect.get(target, propKey, receiver);
      },
      set:function (target, propKey, value, receiver) {
          if(propKey=='pwd'){
              if(!Number.isInteger(value)){
                  throw new TypeError('The age is not an integer');
              }else{
                  console.log("set success");
              }
          }else{
              console.log("set success");
          }
          return Reflect.set(target, propKey, value, receiver);
      }
  }
  let pro = new Proxy(target,handler);
  console.log(pro.name,pro.pwd); //rdb 123456

    pro.name='jack';
    pro.pwd=123;
  console.log(pro.name,pro.pwd); //jack 123 //当pwd是字符串是会抛出异常


</script>
复制代码

(3)has(target, propKey):用来拦截对象是否具有某个属性值的操作,第一个参数为目标对象,第二个参数为属性名

复制代码
<script type="text/javascript">
  //Proxy
  let target = {name:'rdb',pwd:123456}
  let handler = {
      get:function(target, propKey, receiver){
            if(propKey in target){
                console.log("success");
            }else{
                console.log("false");
            }
          return Reflect.get(target, propKey, receiver);
      },
      set:function (target, propKey, value, receiver) {
          if(propKey=='pwd'){
              if(!Number.isInteger(value)){
                  throw new TypeError('The age is not an integer');
              }else{
                  console.log("set success");
              }
          }else{
              console.log("set success");
          }
          return Reflect.set(target, propKey, value, receiver);
      },
      has:function(target, propKey){
          console.log('handle has');
          return propKey in target;
      }
  }
  let pro = new Proxy(target,handler);
  console.log(pro.name,pro.pwd); //rdb 123456

    pro.name='jack';
    pro.pwd=123;
  console.log(pro.name,pro.pwd); //jack 123 //当pwd是字符串是会抛出异常

  console.log('name' in pro);//判断
  console.log('pwd' in pro);//判断


</script>
复制代码

 

2、Reflect 

Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的

posted @   技术小白丁  阅读(331)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示