ES6: Proxy概念及用法

news2024/9/25 13:14:55

Proxy如其名, 它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器”

引入问题:

//问题: 能够在obj.data修改成222之前拦截到这个操作
/*
  本质上, 我们想要在修改属性值的同时, 去修改DOM值, 即做到同步更新页面
*/
let obj = {
  data: "111"
}
obj.data = "222"

如果我们采用ES6之前的方式解决, 采用Object.defineProperty(对象, 属性, {})

let obj = {}
Object.defineProperty(obj, "data", {
  get() {
    console.log("get"); // 属性被访问时调用
  },
  set() {
    console.log("set"); // 属性被修改时调用
  }
})
console.log(obj.data); // get undefined <-此时调用get
obj.data = "test" // set <-此时调用set

实际应用: 更新对象属性, 同时更新页面

let obj = {}
Object.defineProperty(obj, "data", {
  get() {
    console.log("get");
    return box.innerHTML
  },
  set(value) {
    console.log("set");
    box.innerHTML = value
  }
})
console.log(obj.data); 
obj.data = "test"

注意: vue3之后把Object.defineProperty替换成了Proxy

总结一下 Object.defineProperty 的缺点:

1-每次只能拦截一个属性

2-它只能拦截对象


以下是Proxy中的方法:

get方法: 访问属性时触发

let target = {}
let proxy = new Proxy(target,{
    get(target,prop){
        return target[prop]
    }
})

set方法: 修改属性时触发

let target = {}
let proxy = new Proxy(target,{
    get(target,prop){
        return target[prop]
    },
    set(target,prop,value){
        if(prop==="data"){
            box.innerHTML = value
        }
        target[prop] = value;
    }
})

has方法: 判断有没有某个属性(需要在proxy下使用, 并通过”属性” in proxy来判断**)**

let target = {
    _prop: "内部数据"
}
let proxy = new Proxy(target, {
    get(target, prop) {
        return target[prop]
    },
    set(target, prop, value) {
        if (prop === "data") {
            box.innerHTML = value
        }
        target[prop] = value;
    },
    has(target, key) {
        if (key[0] === '_') {
            return false;
        }
        return key in target;
    }
})

注意: 我们可以通过 ”属性” in proxy 的方式来判断对象是否有属性

 

this问题

在proxy中的get与set的this指向的就是proxy. 因此, 如果是对象的方法, 我们需要对它的this进行修正

let s = new Set()

let proxy = new Proxy(s, {
  get(target, key) {
    // 如果是方法, 需要修正this指向
    let value = target[key]
    if(value instanceof Function) {
      return value.bind(target)
    }
    return value
  },
  set() {
    console.log("set");
  }
})
//proxy.add(1) // Uncaught TypeError: Method Set.prototype.add called on incompatible receiver #<Set>
//修改后:
console.log(proxy.add(1)); // Set(1) {1}

Proxy本质上属于元编程非破坏性数据劫持,在原对象的基础上进行了功能的衍生而又不影响原对象,符合松耦合高内聚的设计理念。

参考: 015-ES6-Proxy_哔哩哔哩_bilibili 

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

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

相关文章

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

# 问题原因 关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序&#xff1a;父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块…

前端学习——Web API (Day3)

事件流 事件流和两个阶段说明 事件捕获 事件冒泡 阻止冒泡 解绑事件 事件委托 案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" …

day1-搜索插入位置

搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: …

flutter开发实战-底部bottomNavigationBar➕PageView

flutter开发实战-底部bottomNavigationBar tabbar在app中非常常见&#xff0c;底部BottomNavigationBar属性 一、BottomNavigationBar属性 BottomNavigationBar组件的常用属性&#xff1a; type&#xff1a;tabbar样式&#xff0c;默认为白色不显示&#xff1b;fixedColor:t…

AR眼镜:可视化声音

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 音频可以包括各种各样的声音&#xff0c;从人类语音到非语音声音&#xff0c;如狗吠和警笛声。在为有听力障碍的人设计可访问的应用程序时&#xff0c;应用程序应该能够识别声音并理…

【二分查找】面试题 08.03. 魔术索引

面试题 08.03. 魔术索引 解题思路 改写递归二分查找的思路首先查找mid的值是不是mid 如果是 由于有多个解&#xff0c;那么递归搜索左半边的空间然后如果没找到&#xff0c;首先搜索左半边的空间&#xff0c;然后搜索右半边的空间 class Solution {public int res -1;privat…

mybatis-plus案例报错

报错信息: Error creating bean with name ‘dataSource’ defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Generic.class]: Bean instantiation via factory method failed; nested exception is org.springframework…

ELK 企业级日志分析系统(一)

ELK 一、ELK理论日志管理方案为什么要使用ELK完整日志系统基本特征ELK 简介ELK 的工作流程 二、ELK实验ELK Elasticsearch 集群部署ELK Logstash 部署&#xff08;在 apche节点上操作&#xff09;ELK Kiabana 部署&#xff08;在 Node1 节点上操作) 一、ELK理论 日志管理方案 …

django对数据库中的表进行重新生成

删除数据库中的表删除项目中migrations包下的初始化文件 进入到manage.py目录下执行命令python manage.py makemigrations执行完上述命令之后&#xff0c;再执行命令python manage.py migrate就可以啦 关于详细的数据表生成见博文&#xff1a;https://blog.csdn.net/David_hou…

IO多路复用之select,poll,epoll

所以&#xff0c;我们调用 select 会把所有要管理的 socket 的 fd (文件描述符&#xff0c;Linux下皆为文件&#xff0c;简单理解就是通过 fd 能找到这个 socket)传到内核中。 此时&#xff0c;要遍历所有 socket&#xff0c;看看是否有感兴趣的事件发生。如果没有一个 socket…

Linux常见维护报错,修复MBR引导/修复grub2菜单/内核文件丢失

目录 一&#xff0c;修复MBR 1.模拟MBR损坏 2.重启查看系统 3.借助当前系统的光盘来进行修复 4.进入修复模式 进行修复 5.恢复正常 二&#xff0c;修复grub2菜单 1.出现情况 2.进入修复模式 3.进行修复grub2菜单 4.退出重启即可 三&#xff0c;内核文件丢失 1.进入安全模式 2.挂…

进销存软件哪个好?怎么选?(附模板)

已经把挑选进销存软件的几个注意点归纳的很到位了&#xff1a; 软件价格收费模式&#xff08;按年付费还是一次性买断&#xff09;功能要贴合本企业使用注重数据的准确性与安全性操作一定要简单要有良好的售后服务支持 在这几点的基础上&#xff0c;我简单说一下&#xff1a;…

运维开发面试题第四期(最后有数据库的题)

linux 如何查看当前linux系统的版本号&#xff08;uname -a 内核 cat /proc/version版本&#xff09;、系统状态《如CPU使用&#xff08;top - bn&#xff09;&#xff0c;内存使用情况&#xff08;vmstat,free-m&#xff09;》、如何查看监控磁盘 io负载&#xff08;iostat/ls…

Docker部署Mysql数据库详解

目录 1. Docker部署Mysql 1.1 Mysql容器 1.1.1 创建Mysql容器 1.1.2 进入Mysql容器并登录Mysql 1.1.3 持久化数据 1.2 远程登录Mysql 1.2.1 修改root加密方式 1.2.2 在容器启动时配置加密方式为mysql_native_password 1.3 Mysql编码 1.3.1 Mysql编码问题 1.3.2 Mysql编码…

虚函数是什么?虚函数是怎么实现的?什么时候用虚函数?

发现自己的笔记记录得四处都是&#xff0c;这些天统一整理汇总一下 1. 虚函数和多态的关系&#xff1a; 虚函数 往往 用于 实现 C的多态性 2. 什么是多态&#xff1a; &#xff08;1&#xff09;Wiki定义 &#xff1a; 指计算机程序运行时&#xff0c;相同的消息 发送给 多…

Acwing 848.有向图的拓扑序列

Acwing 848.有向图的拓扑序列 链接&#xff1a;848. 有向图的拓扑序列 - AcWing题库 /* 啥是拓扑排序? 首先要满足有向无环图的条件 一个有向图&#xff0c;如果图中有入度为 0 的点&#xff0c;就把这个点删掉&#xff0c;同时也删掉这个点所连的边。 一直进行上面出处理&am…

一个合格的测试人员需要具备迅速的反馈力

01 反馈指的是&#xff1a;在信息的传播中&#xff0c;接受者对传播者发出信息的反映。反馈得很重要一个属性就是时间滞延。在测试活动中&#xff0c;笔者经常会团队的测试人员一个问题&#xff1a;开发提交了一段代码后&#xff0c;多久能收到质量反馈&#xff1f;是按天&…

腾讯云轻量应用服务器性能测评一下,感觉还行吧

腾讯云轻量应用服务器性能如何&#xff1f;轻量服务器CPU内存带宽配置高&#xff0c;CPU采用什么型号主频多少&#xff1f;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;腾讯云服务器网详解CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;相对于CVM云服务…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

渠道归因(三)基于Shapley Value的渠道归因

渠道归因&#xff08;三&#xff09;基于Shapley Value的渠道归因 通过Shapley Value可以计算每个渠道的贡献权重&#xff0c;而且沙普利值的计算只需要参加的渠道总数&#xff0c;不考虑顺序&#xff0c;因此计算成本也较低。 传统的shapeley value import itertools from …