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

news2025/1/17 1:12:16

在这里插入图片描述

前言

面试时,我们说完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); // 1

obj.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.coloradmin.cn/o/1280909.html

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

相关文章

数据结构之二叉树及面试题讲解

💕"从前种种譬如昨日死;从后种种譬如今日生"💕 作者:Mylvzi 文章主要内容:数据结构之二叉树及面试题讲解 一.概念 1.树的定义 树是一种非线性的数据结构,是由n个结点组成的一种非线性集合&…

10. 哈希表

哈希表(hash table),又称散列表,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键 key ,则可以在 \(O(1)\) 时间内获取对应的值 value 。 给定 n 个学生,每个…

OpenGL ES入门教程(三)之为平面桌子添加混合色

OpenGL ES入门教程(三)之为平面桌子添加渐变色 前言零、OpenGL ES实现混合色的原理一、修改绘制的桌子结构1. 三角形扇介绍2. 基于三角形扇结构绘制平面桌子 二、为每个顶点添加颜色属性三、修改着色器1. 顶点着色器2. 片段这色器 四、绘制具有混合颜色的…

Springboot依赖注入时重复初始化Bean的问题

前言 最近做项目,发现了springboot2.7.x在参数initiate的时候可以反复初始化,而且首次异常后,第二次成功居然也可以启动,通过查看源代码发现了问题根源,且在springboot高版本3.x,就出现了了Configuration的…

springmvc+mybatis+mysql8+idea+jqgrid前端

一、背景 主要是为了学习jqgrid前端技术,熟练一下前后端交互数据 二、效果图 访问地址:http://localhost:8080/cr/views/jqGridDemo.jsp 三、代码展示 控制层JqGridController.java @Controller @RequestMapping("/jqgrid") public class JqGridController {pr…

openEuler学习04-ssl升级到openssl-1.1.1w

当前环境ssl的版本是 1.1.1f ,计划升级到openssl-1.1.1w [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)&q…

Selenium自动化测试:通过cookie绕过验证码的操作

验证码的处理 对于web应用,很多地方比如登录、发帖都需要输入验证码,类型也多种多样;登录/核心操作过程中,系统会产生随机的验证码图片,进行验证才能进行后续操作 ​解决验证码的方法如下: 1、开发做个万…

OpenTelemetry系列 - 第2篇 Java端接入OpenTelemetry

目录 一、架构说明二、方式1 - 自动化2.1 opentelemetry-javaagent.jar(Java8 )2.2 使用opentelemetry-javaagent.jar完成自动注入2.3 配置opentelemetry-javaagent.jar2.4 使用注解(WithSpan, SpanAttribute)2.5.1 代码集成WithS…

在Excel中,只需点击几下,就能只复制和粘贴可见单元格

你可以在Excel中隐藏列、行或单元格,以使数据输入或分析更容易。但是,当你复制并粘贴一个包含隐藏单元格的单元格区域时,它们会突然重新出现。 你可能没有意识到,但有一种方法可以只复制和粘贴Microsoft Excel中的可见单元格。只…

SpringMVC常用注解和用法总结

目标: 1. 熟悉使用SpringMVC中的常用注解 目录 前言 1. Controller 2. RestController 3. RequestMapping 4. RequestParam 5. PathVariable 6. SessionAttributes 7. CookieValue 前言 SpringMVC是一款用于构建基于Java的Web应用程序的框架,它通…

FPC和PCB有哪些区别?

现在电子技术越来越先进,CPU可以做到5nm工艺,电路板可以做到几十层,可折叠屏应用多款手机中。 什么是FPC? FPC:Flexible Printed Circuit,柔性电路板,又被称为“软板” FPC 以聚酰亚胺或聚酯薄…

HBASE命令行查看中文字符

问题记录 中文显示的是编码字符不方便查看value\xE5\xB8\xB8\xE5\xAE\x89\xE5\xAE\x891修改前中文显示: 解决方法 1、列族 : 列名 : toString ’2、列族 : 列名 : c(org.apache.hadoop.hbase.util.Bytes).toString ’ scan karry:student,{COLUMNS > [info:…

团队怎么高效制作问卷?

制作调查问卷时并不是一个人就能单独完成,通常情况下,完成一份调查问卷往往需要一个团队的成员参与,相互协作,共同完成。不过,多人协作经常会遇到协作壁垒,导致效率低下,那团队怎么才能高效协作…

K210开发板之VSCode开发环境使用中添加或删除文件(编译失败时)需要注意事项

在最初开始接触,将VScode和编译环境搭载好后,就开始运行第一个程序了,为了后续方便开发测试,这里我自己对照官方提供的例子,自己调试,写了一个简单的文件系统 后续,所有关于开发的源文件都在...…

【无标题】我们只能用成功来摧毁我们,原来的自己只会破败自己的事情。

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

从“AI证件照”到“AI译制片”,爆款AIGC应用的商业化迷思

让郭德纲飙英文、让霉霉说中文的翻译视频生成工具HeyGen和掀起AI证件照热潮的“妙鸭相机”一样,在一阵疯狂刷屏之后,又迅速在各大群里销声匿迹了。 十月份,由HeyGen制作的各种明星跨语言翻译视频,在全网疯传,大家震撼于…

DLL缺失

DLL缺失 参考链接: 方法五,亲测有用

Android 源码编译

一,虚拟机安装 ​ 1.1 进入https://cn.ubuntu.com/download中文官网下载iso镜像 1.2 这里我们下载Ubuntu 18.04 LTS 1.3虚拟VM机安装ubuntu系统,注意编译源码需要至少16G运行内存和400G磁盘空间,尽量设大点 二 配置编译环境 2.1 下载andr…

使用VC++设计程序实现K近邻中值滤波器(KNNMF)、最小均方差滤波器、矢量中值滤波算法进行滤波

VC实现若干种图像滤波技术2 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章: 01- 一元熵值、二维熵值 02- 图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 …

页面表格高度自适应

前言 现在后端管理系统主页面基本都是由三部分组成 查询条件,高度不固定,可能有的页面查询条件多,有的少表格,高度不固定,占据页面剩余高度分页,高度固定 这三部分加起来肯定是占满全屏的,那么我…