面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

在这里插入图片描述

前言

面试时,我们说完Vue响应式原理,或者Vue2和Vue3的区别时,通常会引出Vue3使用了Proxy来优化响应式,而面试官会继续深挖:说说Proxy与Object.defineProperty的区别。

我们不能只说Proxy直接代理一个对象,这只是一个表层表现,我们需要说出更深层的东西。

下面我们来看一下他们的用法和区别吧。

proxy

Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举等)

基本语法:

/** target: 目标对象* handler: 配置对象,用来定义拦截的行为* proxy: Proxy构造器的实例*/
let proxy = new Proxy(target,handler)

基本用法

Proxy处理对象

下面是一个简单的代理obj的代码:
在这里插入图片描述
输出:
在这里插入图片描述

  1. proxy对象会根据handler里面的get set来拦截住我们的读取赋值操作。
  2. 我们修改proxy的值会映射到被代理的对象obj

💦💦那Proxy会捕获到我们更深层次的get set吗?

答案是 不会
在这里插入图片描述
我们这里读取a 里面的 b属性
在这里插入图片描述
发现只能捕获到a这个属性,说明proxy只会浅层拦截,我们需要拦截整个对象还需要手动地去实现,
在这里插入图片描述
我们只需要在读取的时候判断读取的值是不是一个对象,然后递归的去代理即可。

Proxy处理数组

在这里插入图片描述
在这里插入图片描述
我们可以看到Proxy是能监听到数组的修改和添加的

Object.defineProperty

bject.defineProperty() 直接在对象上定义新属性,或修改对象上的现有属性,然后返回该对象。

基础语法:

/** obj: 要在其上定义属性的对象* prop: 要定义或修改的属性的名称或Symbol* descriptor: 定义或修改的属性的描述符*/
Object.defineProperty(obj, prop, descriptor)

示例

Obeject.defineProperty处理对象

var obj = {}
Object.defineProperty(obj,'name',{value:'张三'
}obj.name // '张三'
obj.name = '李四' // 给obj.name赋新值
console.log(obj.name) // 输出:张三 ,值还是没有改变,因为默认不可写

一次只能代理一个属性值,如果我们要代理整个对象需要在创建时递归地去给所有属性值添加上get set

Obeject.defineProperty处理数组

const obj = {};let initValue = 1;Object.defineProperty(obj, 'name', {set: function(value) {console.log('set方法被执行了');initValue = value;},get: function() {return initValue;}
});console.log(obj.name); // 1obj.name = []; // 会执行set方法,会打印信息// 给 obj 中的name属性 设置为 数组 [1, 2, 3], 会执行set方法,会打印信息
obj.name = [1, 2, 3];// 然后对 obj.name 中的某一项进行改变值,不会执行set方法,不会打印信息
obj.name[0] = 11;// 然后我们打印下 obj.name 的值
console.log(obj.name);// 然后我们使用数组中push方法对 obj.name数组添加属性 不会执行set方法,不会打印信息
obj.name.push(4);obj.name.length = 5; // 也不会执行set方法

我们对数组某一项值进行修改的时候是无法监听到set属性的,我们在Vue中不能简单的使用obj.name[0] = newValue,但是vue重写了修改数组的方法

‘push’,
‘pop’,
‘shift’,
‘unshift’,
‘splice’,
‘sort’,
‘reverse’

总结

  1. Proxy 是一个对象的代理,Object.defineProperty只能代理某个属性
  2. Proxy可以在读取时递归代理,Object.defineProperty只能在创建时递归所有
  3. 对象上新增属性,Proxy可以监听到,Object.defineProperty不能
  4. 数组修改,Proxy可以监听到, object.defineProperty不能
  5. Proxy兼容性差

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

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

相关文章

带头双向循环链表:一种高效的数据结构

💓 博客主页:江池俊的博客⏩ 收录专栏:数据结构探索👉专栏推荐:✅cpolar ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🔥编译环境:Visual Studio 2022🎉欢迎大…

基于maobox-gl 纯前端绘制全球色斑图

基于maobox-gl.js、turf.js 绘制全球色斑图绘制 1、准备全球的某一类的点位数据,可以使用turf.js 随机生成点,并点数据赋properties属性 let points turf.randomPoint(30, { bbox: [-180, -90, 180, 90]}); let interpolateOptions {gridType: "…

Linux下Python调用C语言

一:Python调用C语言场景 1,已经写好的C语言代码,不容易用Python实现,想直接通过Python调用写好的C语言代码 2,C比Python快(只是从语言层面,不能绝对说C程序就是比Python快) 3&…

某音订单接口在电商行业中的重要性及实践应用

一、引言 随着移动互联网的快速发展,短视频平台抖音已经成为人们日常生活中不可或缺的一部分。越来越多的商家开始利用抖音平台推广和销售商品,从而实现商业变现。在这个过程中,抖音订单接口起到了至关重要的作用。本文将详细探讨抖音订单接…

希尔排序(Java)

目录 希尔排序的步骤: Java实现希尔排序: 希尔排序(Shell Sort)是一种插入排序的改进算法,它通过比较距离较远的元素交换位置,从而实现数据局部的较小规模排序,逐渐减小元素之间的间隔&#x…

遥感方向期刊总结

开眼看期刊~ 期刊分区信息搜索网址中国科学院文献情报中心期刊分区表升级版科研通期刊查询: 遥感领域常见期刊Nature CommunicationsRemote Sensing of EnvironmentProceedings of the National Academy of Sciences (PNAS)ISPRS Journal of …

C++ day50 买卖股票最佳时机

题目1:123 买卖股票的最佳时机Ⅲ 题目链接:买卖股票的最佳时机Ⅲ 对题目的理解 prices[i]表示股票在第i天的价格,最多可以完成两笔交易,不能同时进行多笔交易 可以买卖一次,两次,也可以不买卖 动态规划…

[字符串操作] 分割乘积

​ 分割乘积 题目描述 给定一个整数,求插入两个乘号将该整数分割成三个数之后,三个数的的最大乘积。 关于输入 只有一行,一个整数。 关于输出 所求出的最大乘积。 例子输入 4242例子输出 336提示信息 整数有正有负,注意&…

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…

最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数…

Redis Cluster

概念 Redis Cluster采用多主多从的方式,支持开启多个主节点,每个主节点可以挂载多个从节点。 Cluster会将数据进行分片,将数据分散到多个主节点上,而每个主节点都可以对外提供读写服务。这种做法使得Redis突破了单机内存大小的限制…

2023第二届全国大学生数据分析大赛AB题代码

看大家需求量比较大,所以更新了一下A、B题的示例代码,部分截图如下 A题部分截图 B题部分截图 免费获取代码 关注威信公众号 Python风控模型与数据分析,回复 23年数据分析大赛代码 文末查看如何免费获取代码;编写不易,…

低效的DOM操作(js的问题)

使用 JavaScript 操作DOM(即添加、修改和删除元素)是相对容易,但操作效率却不怎么样。 比如,每次添加一系列DOM元素。添加一个DOM元素是一个昂贵的操作。连续添加多个DOM元素的代码是低效的。 当需要添加多个DOM元素时&#xff…

【数据结构】AOV网与拓扑排序

一.AOV网的概念(Activity On Vertex Network) 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系。这样的有向图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network&#xf…

scikit-learn线性回归法进行利润预测

大家好,生成式人工智能无疑是一个改变游戏规则的技术,但对于大多数商业问题来说,回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习,首先必须了解关注的数据以及它是如何被使用的。投资公…

anaconda 笔记:安装anaconda之后显示conda command not found

解决方法是在.bashrc文件中添加如下一行文字(如果没有.bashrc文件,就在root中新建一个这个文件) export PATH$PATH:/home/Your_name/anaconda3/bin也就是安装anaconda3的路径 然后退出编辑,在命令行中敲入 source ~/.bashrc即可…

云原生Kubernetes系列 | init container初始化容器的作用

云原生Kubernetes系列 | init container初始化容器的作用 kubernetes 1.3版本引入了init container初始化容器特性。主要用于在启动应用容器(app container)前来启动一个或多个初始化容器,作为应用容器的一个基础。只有init container运行正常后,app container才会正常运行…

Spring——IOC,DI,AOP

Spring框架是一个轻量级的Java开发框架,它提供了许多功能强大的特性来简化Java应用程序的开发。其中,IOC(控制反转)、DI(依赖注入)和AOP(面向切面编程)是Spring框架的三大核心特性。…

k8s安装学习环境

目录 环境准备 配置hosts 关闭防火墙 关闭交换分区 调整swappiness参数 关闭setlinux Ipv4转发 时钟同步 安装Docker 配置Yum源 安装 配置 启动 日志 安装k8s 配置Yum源 Master节点 安装 初始化 配置kubectl 部署CNI网络插件 Node节点 检查 环境准备 准…

同步代码,异步代码-微任务 宏任务 事件循环(输出题)

1.知识点 事件循环: 由浏览器Web API管理的异步代码,如果有结果后,会根据这个异步代码的类型,被放入对应的微任务或宏任务当中。当执行栈的任务(同步代码)全部执行完毕后,再执行完所有微任务的…