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

Proxy详解

监听对象属性:

在之前,若希望监听一个对象的相关操作,可通过Object.defineProty来进行监听,它必须深度遍历对象里的每一个属性

const obj={name:'why',age:18,height:1.65
}
// 需求:监听对象属性的所有操作
// 监听属性的操作
// 1.只针对一个属性
// let _name=obj.name
// Object.defineProperty(obj,'name',{
//   set: function(newValue){
//     console.log("监听:给name设置了新值:",newValue);
//     _name=newValue
//   },
//   get: function(){
//     console.log("监听:获取name的值");
//     return _name
//   }
// })// 2.监听所有的属性:遍历所有的属性,对每一个属性使用defineProperty
const keys=Object.keys(obj)
for(const key of keys){let value=obj[key]Object.defineProperty(obj,key,{set: function(newValue){console.log(`监听:给${key}设置了新值`,newValue);value=newValue},get: function(){console.log(`监听:获取${key}的值`);return value}})
}
console.log(obj.name);
console.log(obj.age);
obj.name='zcy'
obj.age=21

缺点:

1.其设计初衷并不是为了去监听一个对象,它一次只能监听对象里的一个属性→若想监听所有,就得遍历对象key

2.目前只能用它监听属性的设置和获取,不能监听增加和删除

在ES6中,新增了一个Proxy类,就是为了我们监听一个对象而生的

先创建一个代理对象,之后对该对象的所有操作,都通过代理对象完成,代理对象可监听我们想要原对象进行哪些操作

优点:

Proxy无需一层层递归为每个属性添加代理,一次即可完成以下操作,性能上更好,并且原本的实现有一些数据不能监听到,但是Proxy可以完美监听到任何方式的数据改变。

唯一缺陷:因为Proxy是ES6中引入的新特性,因此它在一些旧的浏览器或者环境中可能不被支持

const obj={name:'why',age:18,height:1.88
}
// 1.创建一个代理对象
const proxy = new Proxy(obj,{set:function(target,key,newValue){console.log(`监听:监听${key}的设置值:`,newValue);target[key]=newValue},get:function(target,key){console.log(`监听:监听${key}的获取`);return target[key]},deleteProperty:function(target,key){const deleted = delete target[key]console.log(`监听:监听删除${key}属性,删除操作结果:${deleted}`);return delete target[key]},has:function(target,key){console.log(`监听:监听in判断${key}属性`);return key in target}
})
// delete
delete proxy.name;
// has
console.log("age"in proxy);


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

相关文章:

  • 深入理解Vue 3的Composition API和<script setup>语法糖
  • 【C语言】扫雷游戏(一)
  • Spring Shell如何与SpringBoot集成并快速创建命令行界面 (CLI) 应用程序
  • 【Oracle11g SQL详解】ORDER BY 子句的排序规则与应用
  • AI开发-PyTorch-NLP-One-Hot/Word2Vec/GloVe/FastText
  • python 操作二进制文件(视频、音频、文本)
  • 大数据hadoop、spark、flink、kafka发展的过程
  • 【MySQL-6】MySQL的复合查询
  • RPC中定时器制作思路
  • 视觉语言动作模型VLA的持续升级:从π0之参考基线Octo到OpenVLA、TinyVLA、DeeR-VLA、3D-VLA
  • 贪心算法理论
  • JavaScript 前端开发:从入门到精通的奇幻之旅
  • 自动驾驶目标检测融合全貌
  • 点击A组件跳转到B页面的tab的某一列
  • 云备份实战项目
  • 探索嵌入式硬件设计:揭秘智能设备的心脏
  • 【Rust在WASM中实现pdf文件的生成】
  • debian 11 虚拟机环境搭建过坑记录
  • Flink常见面试题
  • 嵌入式C编程:宏定义与typedef的深入对比与应用
  • Python知识分享第十六天
  • Hadoop生态圈框架部署(九)- Hive部署
  • MySQL中如何减少回表
  • 微服务即时通讯系统的实现(服务端)----(3)
  • 基础Web安全|SQL注入
  • 《装甲车内的气体卫士:上海松柏 S-M4 智能型气体传感器详解》