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

简单Proxy使用

文章目录

    • 前言
    • 概念


前言

在完成仿写任务时,用其来检测变量的改变,故借此总结学习一下

概念

Proxy 可以拦截并自定义对某个对象的基本操作
语法如下

const name = new Proxy(target, handler);

target:要被代理的对象
handler:拦截器对象,里面放有“陷阱函数”

通过name访问target时若此次操作行为在拦截器对象中存在对应的陷阱函数,那么此次操作将根据拦截器中对应的函数来触发
通过target直接访问原对象则不会触发

如下可以拦截数组的增加和删除功能

const arr=[1,2,3,4,5,6,7,8]const role=new Proxy(arr,{set(target, property, value){//对于数组操作 改值和改length都会触发,但我们的自定义方法仅需调用一次故console.log('在外部故触发俩次');if (property === 'length') {//只有当改length时才触发console.log('准备修改length');}let a=Reflect.set(target, property, value)//此方法就是进行此次操作赋值类似target[property]=value//返回值是是否成功完成此次赋值   成功为true反之//在此之后赋值已经完成了// 直到return a//陷阱函数也需要返回布尔值来确认此次方法是否成功},deleteProperty(target, property){//此方法只会在调用delete关键字才会触发console.log('准备删除');let result=Reflect.deleteProperty(...arguments);}})console.log(arr.length);delete role[2]//触发自定义的删除,但delete只是释放了对应的地址// 还需要role.push(9)console.log(arr.length);arr.splice(2,1)//来删除console.log(arr.length);console.log(arr);

控制台如图
在这里插入图片描述
陷阱函数

  1. set
    上述的set只拦截 赋值 操作
    role.push(9)有俩次拦截,第一次是对数组扩充赋值的拦截
    第二次则是给length赋予新值而被拦截

  2. deleteProperty
    deleteProperty只拦截删除操作
    如上

  3. get
    拦截读取操作

//加入
,get(target, property){console.log('拦截读取');Reflect.get(...arguments);}
//调用
console.log(role[2])

结果
在这里插入图片描述
总结

  1. 陷阱函数需要返回布尔值来判断此次操作是否成功
    可以调用Reflect.对应函数(...arguments)来进行赋值
    在此之前操作属于拦截状态未执行,反之
  2. set拦截的是赋值操作,对数组进行赋值会有俩次拦截
    分别是length赋值和扩充数组
  3. 使用
http://www.dtcms.com/a/295870.html

相关文章:

  • 【Newman+Jenkins】实施接口自动化测试
  • Python 使用环境下编译 FFmpeg 及 PyAV 源码(英特尔篇)
  • AIRIOT智慧选煤厂管理解决方案
  • HTTP性能优化实战:从协议到工具的全面加速指南
  • 【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等
  • OpenCV(03)插值方法,边缘填充,透视变换,水印制作,噪点消除
  • Python中浅拷贝和深拷贝的理解
  • 力扣 hot100 Day54
  • mvn dependency:tree 使用详解?
  • Leetcode 07 java
  • 赋能决策与创新的数据引擎:数据分析平台的价值与未来
  • b-up:Enzo_mi:Transformer DETR系列
  • 10_Spring Boot 中的 @Scheduled 注解是单线程还是多线程?同步还是异步?
  • 基于深度学习的肺癌肿瘤细胞图像识别与分类系统
  • 技术赋能多元探索:我的技术成长与行业洞察
  • 解决 WSL 中无法访问 registry-1.docker.io/v2/,无法用 docker 拉取 image
  • 新能源电池厂自动化应用:Modbus TCP转DeviceNet实践
  • IDM下载失败全面排查指南
  • 医疗设备自动化升级:Modbus TCP与DeviceNet的协议协同实践
  • DPO:大语言模型偏好学习的高效方案
  • Python 程序设计讲义(15):Python 的数据运算——位运算
  • Opentrons 模块化平台与AI技术助力智能移液创新,赋能AAW™自动化工作站
  • 深入探索Amazon SQS:构建弹性微服务与无服务器应用的秘密武器
  • 如何在Ubuntu系统下创建桌面快捷方式
  • Vue 3 项目性能优化指南
  • rk3588开发板使用硬件编码处理视频
  • 如何在 Windows 上安装 MongoDB 及常见问题
  • AI总结视频以及谷歌浏览器插件安装步骤
  • RAGFlow:检索增强生成技术的高效实现与深度探索
  • Day02_C++编程