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

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.kler.cn/a/418844.html

相关文章:

  • 【热门主题】000072 分布式数据库:开启数据管理新纪元
  • vue 2 父组件根据注册事件,控制相关按钮显隐
  • 无人机数据处理系统:原理与核心系统
  • [Deep Learning] 深度学习中常用函数的整理与介绍(pytorch为例)
  • Cursor AI快捷键的使用场景及作用
  • javaScript数据类型存储
  • Oracle12.2 RAC集群管理修改IP地址(DNS解析)
  • 洛谷 P1558 色板游戏(线段树)
  • 管理表空间和数据文件(二)
  • 江协科技最新OLED保姆级移植hal库
  • 阅文集团大数据面试题及参考答案
  • qt 的udp发送和接收
  • Vue SSR基础介绍与实践
  • Pycharm使用Jupyterlab报错:Jupyter command `jupyter-notebook` not found
  • 计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
  • AI 编译器学习笔记之十三 -- Pytorch 特性实现
  • [golang][MAC]Go环境搭建+VsCode配置
  • 设计模式学习[10]---迪米特法则+外观模式
  • mrRobot解题过程
  • 基于自编码器的深度回归模型:原理、实现与分析
  • Cause: java.sql.SQLException: No value specified for parameter 4
  • 【机器学习】梯度消失和梯度爆炸问题
  • pytorch中一个tensor经过多次softmax会有什么变化?
  • 【Linux课程学习】:《简易版shell实现和原理》 《哪些命令可以让子进程执行,哪些命令让shell执行(内键命令)?为什么?》
  • Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
  • 未来已来!联想推出汽车智能空间解决方案