ES6的代理Proxy和反射Reflect的使用

news2024/11/29 4:27:08

一、Proxy使用

  • 作用:Proxy是ES6为了操作对象而引入的API,不直接作用于对象,而是通过类似媒介的方式进行对象的操作
  • 使用
/**
 * target:需要proxy处理的对象
 * handler:对对象进行处理的方法
*/
let proxy = new Proxy(target,handler);
  • 作用
    • 拦截对象get操作
    {
      /**
       * target:需要proxy处理的对象
       * handler:对对象进行处理的方法,如set、get
       */
      let user1 = {
        name: "Mike",
        phone: "13146467899",
        addr: "zh",
      };
      let proxy = new Proxy(user1, {
        get: function (target, key) {
          switch (key) {
            case "phone":
              return (
                target[key].substring(0, 3) + "****" + target[key].substring(7)
              );
            case "name":
              return target[key].substring(0, 1) + "**";
            default:
              return target[key];
          }
        },
      });
    
      console.log(proxy.phone, proxy.name); // 131****7899 M**
    }
    
    • 拦截对象set操作
    {
      /**
       * target:需要proxy处理的对象
       * handler:对对象进行处理的方法,如set、get
       */
      let user1 = {
        name: "Mike",
        phone: "13146467899",
        addr: "zh",
      };
      let proxy = new Proxy(user1, {
        // 拦截set
        set(target, key, value) {
          if (key === "id") {
            return (target[key] = value + "1xx");
          } else {
            return target[key];
          }
        },
      });
    
      proxy.id = "xxx";
      console.log(proxy.id, proxy.name); // xxx1xx Mike
    }
    
    • 拦截对象has操作
    {
      /**
       * target:需要proxy处理的对象
       * handler:对对象进行处理的方法,如set、get
       */
      let user1 = {
        name: "Mike",
        phone: "13146467899",
        addr: "zh",
      };
      let proxy = new Proxy(user1, {
        // 拦截has操作
        has: function (target, key) {
          if (key in target) {
            console.log(`${key}:`, target[key]);
            return true;
          } else {
            return false;
          }
        },
      });
      console.log("name" in proxy); // name: Mike true
    }
    
    • 拦截对象delete操作
    {
      /**
       * target:需要proxy处理的对象
       * handler:对对象进行处理的方法,如set、get
       */
      let user1 = {
        name: "Mike",
        phone: "13146467899",
        addr: "zh",
        // 私有属性
        _id: "s112ewd",
      };
      let proxy = new Proxy(user1, {
    
        // 拦截delete操作
        deleteProperty: function (target, key) {
          if (key.indexOf("_") === 0) {
            console.warn("私有属性无法删除");
            return false;
          }
          return true;
        },
      });
      
      console.log(delete proxy["_id"]); // 私有属性无法删除
    }
    
    • 拦截对象key属性
    	{
      /**
       * target:需要proxy处理的对象
       * handler:对对象进行处理的方法,如set、get
       */
      let user1 = {
        name: "Mike",
        phone: "13146467899",
        addr: "zh",
        // 私有属性
        _id: "s112ewd",
      };
      let proxy = new Proxy(user1, {
    
        // 拦截指定的属性名称,会遍历对象
        ownKeys(target) {
          return Object.keys(target).filter((item) => {
            return item !== "id" && item.indexOf("_") !== 0;
          });
        },
      });
    
      console.log(Object.keys(proxy)); // ['name', 'phone', 'addr']
    }
    

二、Reflect的使用

  • 介绍:
    • 与Proxy相同,ES6引用Reflect也是用来操作对象的,它将对象里⼀些明显属于语言内部的方法移植到Reflect对象上,它对某些方法的返回结果进行了修改,使其更合理,并且使用函数的方式实现了Object的命令式操作
  • 使用
{
  let user = {
    name: "fluyi",
    age: 18,
  };
  console.log(Reflect.has(user, "name")); // true
  console.log(Reflect.set(user, "name", "Jenny")); //true
  console.log(Reflect.get(user, "name")); // Jenny
}

三、Proxy与Reflect实现简单的双向数据绑定

{
  // 获取dom元素
  const inObj = document.getElementById("input");
  const outObj = document.getElementById("txt");

  // 设置代理对象
  let obj = {};

  // 配置代理对象选项
  let handler = {
    get: function (target, key) {
      return Reflect.get(target, key);
    },
    set: function (target, key, value) {
      // 如果输入为文本
      if (key === "text") {
        inObj.value = inObj.value === value ? inObj.value : value;
        outObj.innerHTML = value;
      }
      return Reflect.set(target, key, value);
    },
  };

  // 配置代理对象
  let proxy = new Proxy(obj, handler);

  // 添加监听事件
  inObj.addEventListener("keyup", function (event) {
    proxy.text = event.target.value;
  });

  proxy.text = 124;
}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>var 与const </title>
</head>

<body>

    <h1>双向绑定功能</h1>
    <input type="text" id="input">
    <h2>你输入的内容是:<i id="txt"></i></h2></script>
</body>

</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM uboot源码分析2-启动第一阶段

一、start.S 解析5 注释的中文含义&#xff1a; 当我们已经在 RAM 中运行时&#xff0c;我们不需要重新定位 U-Boot。实际上&#xff0c;在 U-Boot 在 RAM 中运行之前&#xff0c;必须配置内存控制器。 1、判断当前代码执行位置 (1) lowlevel_init.S 的 110-115 行。 (2) 这几…

5年经验之谈:月薪3000到30000,测试工程师的变“行”记!

自我介绍下&#xff0c;我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触…

ESP32 Arduino(十二)lvgl移植使用

一、简介LVGL全程LittleVGL&#xff0c;是一个轻量化的&#xff0c;开源的&#xff0c;用于嵌入式GUI设计的图形库。并且配合LVGL模拟器&#xff0c;可以在电脑对界面进行编辑显示&#xff0c;测试通过后再移植进嵌入式设备中&#xff0c;实现高效的项目开发。SquareLine Studi…

RMI攻击中的ServerClient相互攻击反制

前言 前文中&#xff0c;我们分析了攻击Registry的两种方式&#xff0c;这里我们接着前面的内容&#xff0c;分析Server和Client的相互攻击方式。 Attacked Server Attacked By Client 首先我们搭建个示例&#xff0c;这里直接注册端和服务端放置在一起。 package pers.rm…

JS 实现抛物线动画案例

相信大家都有浏览过&#xff0c;很多购物网站购物车的添加商品动画&#xff0c;今天&#xff0c;我们就手写一个简单的抛物线动画&#xff0c;先上案例&#xff1a; 一、绘制页面 我们这里简单实现&#xff0c;一个按钮&#xff0c;一个购物车图标&#xff0c;样式这里直接跳过…

GNN图神经网络原理解析

一、GNN基本概念 1. 图的基本组成 图神经网络的核心就是进行图模型搭建&#xff0c;图是由点和边组成的。在计算机处理时&#xff0c;通常将数据以向量的形式进行存储。因此&#xff0c;在存储图时&#xff0c;就会有点的向量&#xff0c;点与点之间边的向量&#xff0c;全局…

Acwing---1235. 付账问题

付账问题1.题目2.基本思想3.代码实现1.题目 几个人一起出去吃饭是常有的事。 但在结帐的时候&#xff0c;常常会出现一些争执。 现在有 nnn个人出去吃饭&#xff0c;他们总共消费了 SSS元。 其中第 iii 个人带了 aiaiai元。 幸运的是&#xff0c;所有人带的钱的总数是足够…

vue解决跨域问题-反向代理

浏览器有同源策略&#xff0c;限制同协议、同域名、同端口&#xff0c;只要有一项不一致&#xff0c;就是跨域。&#xff08;不同源则跨域&#xff09; 解决方案&#xff1a; 后端 、cors 、 jsonp、 反向代理 同源下&#xff1a;浏览器向服务器请求数据&#xff0c;服务器响应…

jenkins +docker+python接口自动化之docker下安装jenkins(一)

jenkins dockerpython接口自动化之docker下安装jenkins&#xff08;一&#xff09; 目录&#xff1a;导读 1、下载jenkins 2、启动jenkins 3、访问jenkins 4.浏览器直接访问http://ip/:8080 5.然后粘贴到输入框中,之后新手入门中先安装默认的插件即可&#xff0c;完成后出…

俄罗斯方块游戏代码

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽…

图表控件LightningChart .NET再破世界纪录,支持实时可视化 1 万亿个数据点

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)

百度地图开发系列目录 数据可视化大屏应急管理综合指挥调度系统完整案例详解&#xff08;PHP-API、Echarts、百度地图&#xff09;数据可视化大屏百度地图API开发&#xff1a;停车场分布标注和检索静态版百度地图高级开发&#xff1a;map.getDistance计算多点之间的距离并输入…

元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情

在刚刚结束的元宵节晚会上&#xff0c;德云社的岳云鹏&#xff0c;再一次参加并引起轰动&#xff0c;并获得了观众朋友们的一致好评。 不过有细心的网友发现&#xff0c;早前央视元宵晚会节目预告&#xff0c;并没有看到小岳岳&#xff0c;难道是不敢提前透露&#xff0c;怕公布…

TCP 三次握手和四次挥手

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录TCP 建立连接(三次握手)为啥不能是 4 次&#xff1f;为啥不能是 2 次&#xff1f;三次握手的意义&#xff1a;TCP 断开连接(四…

前端报表如何实现无预览打印解决方案或静默打印

在前端开发中&#xff0c;除了将数据呈现后&#xff0c;我们往往需要为用户提供&#xff0c;打印&#xff0c;导出等能力&#xff0c;导出是为了存档或是二次分析&#xff0c;而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑&#xff0c; 而前端打印可…

Android Binder机制之一(简介)

目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了&#xff0c;其实每次看都有新的收获&…

Docker搭建本地私有仓库

目录 一、本地私有仓库的优点 二、Docker搭建本地私有仓库 2.1、首先下载 registry 镜像 2.2、在 daemon.json 文件中添加私有镜像仓库地址 2.3、运行 registry 容器 2.4、Docker容器的重启策略 2.5、为镜像打标签 2.6、上传到私有仓库 2.7、私有仓库的 centos 镜像有…

Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中

Cubox是什么应用&#xff1f; Cubox 是一款跨平台的网络收藏工具&#xff0c;通过浏览器扩展、客户端、手机应用、微信转发等方式&#xff0c;将网页、文字、图片、语音、视频、文件等内容保存起来&#xff0c;再经过自动整理、标签、分类之后&#xff0c;就可以随时阅读、搜索…

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

windeployqt实现一键打包

每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…