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

VUE2—defineProperty和VUE3—proxy 详解

前言

使用过vue开发的盆友都知道Vue2和Vue3的响应式原理是不一样的,vue2用的是Object.definePropertyvue3用的是proxy。那他们具体是什么呢?又有什么区别呢?下面叫我简单做个笔记。有什么错误望各位大佬不吝指点。

什么是Object.defineProperty()

Object.defineProperty是 es5 引入的一个方法,用于定义修改对象的属性的方法,可以控制属性的特性(如可枚举性、可配置性、可写性等)。

Object.defineProperty()语法

Object.defineProperty(obj, prop, descriptor)

参数说明

  • obj:定义属性的对象。
  • prop:定义或修改的属性的名称。
  • descriptor:属性的描述符对象,包含属性的特性设置。

descriptor 对象下包含的属性

  • value:属性的值。
  • writable:属性是否可写,即是否可以使用赋值操作符改变属性值。
  • configurable:属性描述符是否可以被改变,或者属性是否可以被删除,默认为false。
  • enumerable:属性是否可枚举,即是否会出现在使用 for...in 循环时。
  • get:一个函数,当属性被读取时调用,返回属性值。
  • set:一个函数,当属性被赋值时调用,接收新值作为参数。
<script>// 定义一个对象名为(person)的对象【对象的属性有(name、sex)】
let person = { name: '小明', sex: '男'}//给对象(person)添加一个属性名为(age)的属性,属性描述符只包含了 value 属性,表示 age 属性的初始值。
Object.defineProperty(person, 'age', {value: 18,         // 属性的值 enumerable: true,  // 属性是否可枚举writable: true,    // 属性是否可写/可修改configurable: true // 属性是否可以被删除
})console.log(person);</script>

 proxy简介

Proxy是ES6中的一种用于创建代理对象的特殊对象。它允许我们定义自定义行为,例如拦截和修改对象的默认操作。Proxy可以用于拦截对象的各种操作,包括属性访问、赋值、函数调用等。

Proxy 构造函数接受两个参数目标对象(被代理的对象)和一个处理器对象(用于定义拦截器)

常用的拦截方法包括:getsetapplyconstruct、deletePropertyhasgetOwnPropertyDescriptor等。【这些拦截方法会在代理对象进行对应操作时自动触发

注:Proxy详解见我另一篇文章: ES6之---Proxy简介    这里就不过多叙述了

// 写法:target是目标对象,handler是处理器对象
const proxy = new Proxy(target, handler);简单示例let star = {
name: '小明',
age: 18
}
let proxy = new Proxy(star,{get(targetObj, propoty, receiver) {console.log(`我是被代理的对象${targetObj}`)console.log(`我是你访问的被代理的属性${propoty}`)//receiver是代理对象proxyreturn targetObj[propoty]}
})

vue中defineProperty和proxy对比

1.监听数据的角度

  1.  defineproperty只能监听某个属性而不能监听整个对象。
  2. proxy不用设置具体属性,直接监听整个对象
  3. defineproperty监听需要知道是哪个对象的哪个属性,而proxy只需要知道哪个对象就可以了。也就是会省去for in循环提高了效率

2.监听对原对象的影响

  1. 因为defineproperty是通过在原对象身上新增或修改属性增加描述符的方式实现的监听效果,一定会修改原数据
  2. proxy只是原对象的代理,proxy会返回一个代理对象不会在原对象上进行改动,对原数据无污染。

3.实现对数组的监听

  1. 因为数组 length 的特殊性 (length 的描述符configurable 和 enumerable 为 false,并且妄图修改 configurable 为 True 的话 js 会直接报错:VM305:1 Uncaught TypeError: Cannot redefine property: length)
  2. defineproperty无法监听数组长度变化, Vue只能通过重写数组方法的方式变现达成监听的效果,光重写数组方法还是不能解决修改数组下标时监听的问题,只能再使用自定义的$set的方式
  3. proxy因为自身特性,是创建新的代理对象而不是在原数据身上监听属性,对代理对象进行操作时,所有的操作都会被捕捉,包括数组的方法和length操作,再不需要重写数组方法和自定义set函数了。(代码示例在下方)

4. 监听的范围

  1. defineproperty只能监听到value的 get set 变化。
  2. proxy可以监听除 [[getOwnPropertyNames]] 以外所有JS的对象操作。(链接看下方)监听的范围更大更全面。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸
  • Go 语言版本管理——Goenv
  • 三、建造者模式
  • Kaggle克隆github项目+文件操作+Kaggle常见操作问题解决方案——一文搞定,以openpose姿态估计项目为例
  • Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解
  • Disjoint-set data structure--并查集
  • 过滤器 与 拦截器
  • window下kafka3启动多个
  • C++高精度算法--加法
  • STM32外部中断(总结了易出现的BUG)
  • Windows10上Nginx如何通过自签名证书方式发布Https服务(下)
  • pycharm 2024.1下载、安装
  • 【c++】cout打印char * 或者char[]的细节详解
  • Java中的事件驱动架构(EDA)
  • 面相对象的成员介绍
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • C++类的相互关联
  • hadoop集群管理系统搭建规划说明
  • Logstash 参考指南(目录)
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • react-native 安卓真机环境搭建
  • Spring声明式事务管理之一:五大属性分析
  • unity如何实现一个固定宽度的orthagraphic相机
  • 记录:CentOS7.2配置LNMP环境记录
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 协程
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 【云吞铺子】性能抖动剖析(二)
  • #define 用法
  • #include到底该写在哪
  • $(function(){})与(function($){....})(jQuery)的区别
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (3) cmake编译多个cpp文件
  • (zhuan) 一些RL的文献(及笔记)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (笔试题)合法字符串
  • (每日一问)基础知识:堆与栈的区别
  • (一)Linux+Windows下安装ffmpeg
  • (一)u-boot-nand.bin的下载
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .gitignore文件设置了忽略但不生效
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET delegate 委托 、 Event 事件
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .NET框架
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法
  • [C/C++随笔] char与unsigned char区别
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++][数据结构][跳表]详细讲解
  • [C++]类和对象【下】