【揭秘Vue核心】深入解析Object.defineProperty和Proxy的区别,让你秒懂!

news2024/11/25 2:37:01

问题:Object.difinePropertyproxy 有什么区别?

Object.definePropertyProxy 是用于实现响应式数据的两种不同方式。

Object.defineProperty

Object.defineProperty 通过直接修改对象的属性描述符来实现数据的劫持。Vue 2.x 中就是通过 Object.defineProperty 来实现数据的响应式。但是 Object.defineProperty 有一些限制,比如只能劫持已经存在的属性,无法对新增属性或删除属性进行劫持。这就导致 Vue 2.x 需要在创建实例之前声明数据属性,否则无法实现响应式。

Object.defineProperty(obj, prop, descriptor)
属性类型描述
value任意类型设置属性的值。
writable布尔值指定属性是否可写。默认为 false,即属性是只读的。
enumerable布尔值指定属性是否可枚举。默认为 false,即属性不会出现在 for…in 循环和 Object.keys() 中。
configurable布尔值指定属性是否可配置。默认为 false,即不可删除并且禁止修改属性的特性(writable、enumerable 和 configurable)。
get函数类型获取属性值的函数。
set函数类型设置属性值的函数。

示例:

let obj = {}
Object.defineProperty(obj, "b", {
  get() {
    return bValue;
  },
  set(newValue) {
    bValue = newValue;
  },
  enumerable: true,
  configurable: true,
});

proxy

而 Vue 3.0 使用了 Proxy,它是 ES6 新增的特性。**Proxy 可以对整个对象进行劫持,包括对新增属性和删除属性的劫持。**它提供了一种编程范式的改变,可以更加灵活地监听和代理对象的操作。

const p = new Proxy(target, handler)
方法作用
get(target, prop, receiver)拦截对目标对象属性的读取操作,并返回相应的值。
set(target, prop, value, receiver)拦截对目标对象属性的写入操作,并进行相应的处理。
has(target, prop)拦截对 in 操作符的操作,判断属性是否存在于目标对象中。
deleteProperty(target, prop)拦截对 delete 操作符的操作,删除目标对象的指定属性。
apply(target, thisArg, arguments)拦截函数的调用操作,并进行相应的处理。
construct(target, arguments, newTarget)拦截对目标对象使用 new 操作符创建实例的操作,并进行相应的处理。
getPrototypeOf(target)拦截对目标对象的原型的读取操作,并返回相应的值。
setPrototypeOf(target, proto)拦截对目标对象的原型的写入操作,并进行相应的处理。
isExtensible(target)拦截对目标对象是否可扩展的判断操作。
preventExtensions(target)拦截对目标对象添加新属性的操作,并进行相应的处理。
getOwnPropertyDescriptor(target, prop)拦截对目标对象属性描述符的读取操作,并返回相应的属性描述符。
defineProperty(target, prop, descriptor)拦截对目标对象属性描述符的写入操作,并进行相应的处理。
ownKeys(target)拦截对 Object.getOwnPropertyNames 和 Object.getOwnPropertySymbols 的操作,返回目标对象所有自身属性的键名。
enumerate(target)拦截对 for…in 循环的操作,返回目标对象所有可枚举的属性名。

通过在 handler 中实现这些方法,我们可以自定义拦截操作的行为,并对底层的对象进行劫持和改变。这使得我们能够更灵活地操作和控制对象的访问、修改和行为。

示例:

onst handler = {
    get: function(obj, prop) {
        return prop in obj ? obj[prop] : 37;
    }
};

const p = new Proxy({}, handler);

对比

Proxy 相比于 Object.defineProperty 的优势:

  • Proxy 可以代理整个对象,而不是单个属性,可以实现更细粒度的拦截和操作。
  • Proxy 可以监听新增属性和删除属性的操作,不需要事先声明属性。

Object.defineProperty 相比于 Proxy 的·优势:

  • Object.defineProperty 支持 IE9+ 浏览器
  • 可处理原始类型的相应,vue3中的 ref

在这里插入图片描述
在这里插入图片描述

延伸

vue3 中,响应式分引用类型、原始类型。

  • reactive() 仅对引用类型有效,原始类型无效 – 因为 JavaScript 没有可以作用于所有值类型的 “引用” 机制;
  • ref()方法来允许我们创建可以使用任何值类型的响应式,传入参数的值包装为一个带 .value 属性的 ref 对象。

Vue 的响应式系统是通过属性访问进行追踪的,因此我们必须始终保持对该响应式对象的相同引用。

注意:替换一个响应式对象(引用地址 => 原始类型),也需要使用 ref

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key)
      return target[key]
    },
    set(target, key, value) {
      target[key] = value
      trigger(target, key)
    }
  })
}

function ref(value) {
  const refObject = {
    get value() {
      track(refObject, 'value')
      return value
    },
    set value(newValue) {
      value = newValue
      trigger(refObject, 'value')
    }
  }
  return refObject
}

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

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

相关文章

vscode 之 工作区的应用(解决vue2插件vetur、vue3插件volar禁用启用问题)

目录 前言创建工作区添加文件夹到工作区为当前打开的工作区指定特定环境工作区删除文件夹如何切换工作区 前言 工作区???为什么要工作区??? 首先工作区简单理解就是vscode工作时的区域、范围; 延…

如何正确的安装MySQL

1. 使用rpm包在线安装 1.1 确认自己电脑版本(linux) [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)ps:本次安装采用的系统为Centos 7.9 所使用的mysql为5.7 1.2 下载rpm包 下载地址 https://dev.mysql.com/downloads/mysql/ ps: 自己…

初识树莓派:强大功能与创造力的结合

目录 树莓派4B简介: 树莓派系统镜像下载: 树莓派4B简介: 树莓派4B是一款功能强大且受欢迎的单板计算机,由树莓派基金会开发。作为树莓派系列的最新版本,4B提供了许多令人兴奋的特性和改进,使其成为教育、创…

SSM简单项目遇到的几个问题(最后一个问题,虽然能运行,但是我找不出问题出在哪里)

这几个问题,干扰了我很长时间。 主要因为书本的例子,是通过controller层返回到jsp层。但是,最后一个SSM项目,它用的是controller返回信息给Service层,再由Service层返回Jsp层。 实训:编写一个模糊查询姓名…

【Java基础教程】(三)程序概念篇 · 上:探索Java编程基础,注释、标识符、关键字、数据类型~

Java基础教程之程序概念 上 本节学习目标1️⃣ Java中的注释2️⃣ 标识符3️⃣ 关键字4️⃣ 数据类型4.1 整型🔍 什么是变量?什么是常量?🔍关于数据类型转换的规则? 4.2 浮点数🔍关于Java的计算的缺陷 4.3…

chatGPT写综述

文献是任何学术研究的基础,但搜集和整合众多的信息,写成一篇健全的文献综述却是一项艰巨的任务。随着人工智能技术的发展,大型预训练语言模型(LM),如OpenAI的ChatGPT变得越来越流行。本文将探讨如何使用Cha…

K8S的概念和基本应用

学习视频:Kubernetes基本概念和应用_哔哩哔哩_bilibili 零 . 架构概览 master节点:管理调度集群资源,一般为多节点构成,可以是物理机,也可以是虚拟机。worker节点:资源的提供者,一般为多节点构…

沟通的层次模型

沟通的层次模型 根据沟通的倾向性将沟通划分为五个层次,分别是情绪、感受、想法、态度和事实。 模型介绍 沟通的层次 第5层:沟通情绪-带着强烈情绪表达,尤其经常使用这些字眼:“总是”、“每次都”第4层:沟通感受-不…

【APP开发】uni-data-select真机下拉框不显示问题

官网示例:uni-data-select 因为外层container有样式: width: 100%; height: 100%; overflow: hidden; display: flex; flex-direction: column; 去掉最外层 class"container"之后就可以了,但具体原因不清楚 我是对比了Hello uni-…

python中多态的作用是什么?

在强类型语言(例如Java或C#)中,多态是指允许使用一个父类类型的变量或常量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。即使用父类的类型来调用子类的方法。 在Python中,多态指在不考虑对象类型…

js压缩base64图片

今天试了用js把base64编码格式的图片进行压缩,记录一下: base64图片转换地址 base64图片转换网址 代码如下 js: $(document).ready(function(){compressImg(targetObj.src, 0.5, useImg, targetObj) });let targetObj {// base64字符串 …

机器学习26:《数据准备和特征工程-IV》数据转换

特征工程 是确定哪些特征可能对训练模型有用,然后通过转换日志文件等数据来源中的原始数据来创建这些特征的过程。在本文中,笔者将重点讨论何时以及如何转换数字和分类数据,以及不同方法的权衡。 目录 1.数据转换的原因 1.1 数据兼容性的强…

并发容器(一)CopyOnWriteArrayList

我们知道,ArrayList,LikedList,HashMap都是线程不安全的容器 同步容器:Vector,HashTable,SynchronizedList是线程安全的,因为里面加了synchronized同步,所以这样的容器也叫同步容器…

Zabbix监控

Zabbix监控 1.Zabbix监控概述1.1 zabbix是什么1.2 zabbix监控原理1.3 Zabbix 6.0新特性1.4 Zabbix 6.0功能组件1.5 Zabbix与prometheus区别对比 2. 部署Zabbix6.02.1 安装NginxPHP2.2 部署Mariadb数据库2.3 安装zabbix Server服务端2.4 部署Web前端,进行访问2.5 部署…

对给定的两个日期之间的日期进行遍历

每日一练:对给定的两个日期之间的日期进行遍历 题目 对给定的两个日期之间的日期进行遍历,比如startTime是2014-07-11;endTime是2014-08-11 如何把他们之间的日期获取并遍历出来。 思路与分析 不难看出,选项的4段实现代码中,除…

产品经理必须懂的api接口文档编写规范,api接口文档入门

很多产品经理刚接触 API 接口工作时,脑子一片空白,不理解接口(API)是什么,更看不懂接口开发文档。那么,作为一个不懂技术的产品经理,该如何看懂接口文档。今天这篇文章就跟大家好好巴拉巴拉。 …

一次阿里云Schedulerx换成Spring定时任务的过程

1、当前现状 所有的任务已经迁移到阿里云Schedulerx;阿里云Schedulerx是按照调用次数收费,有些任务每秒调用一次,费用太高; 2、明确需求 需要把执行非常频繁的定时任务从阿里云迁移(阿里云收费根据调用次数&#xff0c…

基于matlab使用迭代方法为语义分割网络生成对抗性示例(附源码)

一、前言 此示例说明如何使用基本迭代方法 (BIM) 为语义分割网络生成对抗性示例。 语义分割是将图像中的每个像素分配给类标签的过程,例如汽车、自行车、人或天空。语义分割的应用包括自动驾驶的道路分割和医疗诊断的癌细胞分割。 神经网络…

5、架构:通用 Schema 设计

作为前端开发一定会非常熟悉 AST 抽象语法树(Abstract Syntax Tree),当浏览器加载 JS 代码时,它会首先将代码转换为一棵抽象语法树(AST),然后再根据 AST 来渲染对应的 DOM 结构,对于…

接口自动化核心知识点浓缩,为面试加分

日常接触到的接口自动化从实际目标可以划分为两大类: 为模拟测试数据而开展的接口自动化 这种接口自动化大多是单次执行,目的很明确是为了功能测试创造测试数据,节约人工造数据的时间和人工成本,提高功能测试人员的测试效率。 …