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

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇,对于基础的知识点,我感觉自己还是很薄弱的。
趁着假期,再去复习一遍

Object.defineProperty(),对于这个方法,更多的还是停留在面试的时候,面试官问你vue2和vue3区别的时候,不免要提一提这个方法,vue2的底层是Object.defineProperty(),vue3是proxy对象

顺便把两者的区别再罗列一下:

1、性能优化:Vue 3引入了响应式系统的重写,使其更加高效。Vue 3使用了Proxy对象,相较于Vue 2中的Object.defineProperty,Proxy能够更好地捕获并跟踪对响应式数据的修改,提供了更好的性能。

2、更小的体积:Vue 3使用了模块化开发的方法,可以按需导入功能模块,从而减小了框架的整体体积大小。

3、Composition API:Vue 3引入了Composition API,这是一种新的代码组织方式,它允许开发者通过逻辑组合API创建可重用的逻辑块。相比Vue 2中的Options API,Composition API更加灵活和可组合,使得代码更易于维护和重用。

4、更好的TypeScript支持:Vue 3对TypeScript的支持更加友好,通过ts-check指令和相关的类型声明,可以提供更好的类型检查和代码智能提示。

5、Teleport组件:Vue 3中引入了Teleport组件,可以方便地将组件渲染到DOM中的其他位置,这在处理模态框、弹出层等情况下非常有用。

6、更好的递归组件:Vue 3对递归组件的支持进行了改进,可以更好地处理递归组件的更新和渲染。

现在关于Object.defineProperty()方法,再深入一些

Object.defineProperty 是 JavaScript 的一个内置方法,用于在一个对象上定义一个新的属性或修改现有属性的特性。

语法如下:

Object.defineProperty(obj, prop, descriptor)

参数注解:

obj:要在其上定义属性的对象。
prop:要定义或修改的属性的名称。
descriptor:要定义或修改的属性的描述符对象,包含属性的各种特性。

descriptor 对象(也可称为配置项)包含以下可选属性:

value:属性的值,默认为 undefined。
writable:属性的值是否可以被修改。默认为 false,即该属性是只读的。
enumerable:属性是否可枚举(是否出现在对象的枚举属性中)。默认为 false。
configurable:属性是否可以被删除或修改特性。默认为 false。
get:读取时内部调用的函数
set:写入时内部调用的函数

通过 Object.defineProperty 方法在 obj 对象上定义了一个名为 “name” 的属性,该属性的初始值为 “John”,并且可写、可枚举和可配置。后续通过对该属性的赋值操作,可以修改属性的值
示例:

const obj = {};// 定义一个名为 "name" 的可写属性
Object.defineProperty(obj, 'name', {value: 'John',writable: true,enumerable: true,configurable: true
});console.log(obj.name); // 输出 "John"obj.name = 'Tom';
console.log(obj.name); // 输出 "Tom"

直接使用set(修改),get(获取)

const obj = {_name: 'John',get name() {return this._name;},set name(value) {this._name = value;}
};console.log(obj.name); // 输出 "John"obj.name = 'Tom';
console.log(obj.name); // 输出 "Tom"

感觉还是有些不明白吗?那就在大白话一点:

假如已经有一个对象

let person = {
name:'莲花',
gender:'男',
}

现在要添加一个属性age,值38

可以直接在对象里添加

let person = {
name:'莲花',
gender:'男',
age:38
}

假如在实际的工作场景中,要添加的属性是未知的,根据某些条件动态添加,那直接添加肯定不合适
且直接添加和使用Object.defineProperty()去添加还是有区别的,直接添加的可以随意改,随意删,随意被枚举,而Object.defineProperty()添加的可以控制是否允许改,是否允许删,是否允许被枚举。

示例:

let person = {
name:'莲花',
gender:'男',
}
Object.defineProperty(person,'age',{
value:38,})
//参数1:要添加参数的对象,给person对象添加,所以是person
//参数2,要添加的属性名,age
//参数3,配置项

打印看下直接添加和Object.defineProperty()添加的区别
在这里插入图片描述
直接添加,所有属性名的颜色都是一样的,而Object.defineProperty()创建的,age的属性名颜色比其他两个属性名颜色淡一些,这是因为Object.defineProperty()配置项的enumerable属性默认是false,即默认是不可以被枚举的,不参与遍历。
如果我们console.log(Object.keys(person)),打印由person对象所有属性名组成的数组,会发现,直接添加的属性名都可以打印出来,而Object.defineProperty()创建的则没有age

在这里插入图片描述
想要被枚举的话,enumerable设置为true即可

let person = {
name:'莲花',
gender:'男',
}
Object.defineProperty(person,'age',{
value:38,
enumerable:true,//控制属性是否可以被枚举,默认为false
})

如果我们想修改age的值,直接添加的,通过person.value即可修改,但是Object.defineProperty()创建的是不能直接修改的,这就要说到writable属性,默认是false,即默认不允许修改,设置为true即可

let person = {
name:'莲花',
gender:'男',
}
Object.defineProperty(person,'age',{
value:38,
enumerable:true,//控制属性是否可以被枚举,默认为false
writable:true,//控制属性是否可以被修改,默认为false
})

如果我们不想要age这个属性,想删掉,直接添加的,通过delete person.age即可删除,但是Object.defineProperty()创建的是不能直接修改的,这就要说到configurable属性,默认是false,即默认不允许删除,设置为true即可

let person = {
name:'莲花',
gender:'男',
}
Object.defineProperty(person,'age',{
value:38,
enumerable:true,//控制属性是否可以被枚举,默认为false
writable:true,//控制属性是否可以被修改,默认为false
configurable:true,//控制属性是否可以被删除,默认为false
})

如果现在有个number字段,需求是age的值要读取number的值,即动态赋值

直接添加:

let number = 18
let person = {
name:'莲花',
gender:'男',
age:number
}

这样写,确实是把number的值赋给age了,但是如果后期number的值变了,假设变为20,age的值是不会跟着变的,还是原来的18

因为语句从上向下执行的时候,第一次定义的时候已经走完了,以后再改number的值,都只是number自己的事,第一次定义完了就结束了,person对象的值不会再改变。
如果手动修改,重新给age赋值,确实会改变age的值,但是如果想number一改变,age的值就变,那就要用到Object.defineProperty()方法了
//直接手动修改,重新给age赋值示例:


let number = 18
let person = {
name:'莲花',
gender:'男',
age:number
}
number = 20
person.age = number

//Object.defineProperty()示例:


Object.defineProperty(person,'age',{
//当读取person的age属性时,get(getter)函数就会被调用,且返回值是age的值
//get:function(){}
//return number
//})
//简写:
get(){
return number
}
//当修改person的age属性时,set(setter)函数就会被调用,且会收到修改的具体值
//打印value,当值改变的时候确实value接收到了,但是age并没有改变,这是因为person的age属性接收的是number的值
//set确实调用了,但是number变量的值没有改变,所以set中给number赋值
set(value){
number = value
}

这时候,如果number的值改变了,会触发get,age直接拿number的值

如果直接修改person.age,会触发set,先修改number的值,再触发get,age去拿number的值

Object.defineProperty了解了之后,现在开始了解数据代理

数据代理:
通过一个对象代理另一个对象中属性的操作,监听属性的变化、拦截属性的读写等

示例:

let obj = {
a:'1'
}let obj2 = {
b:'2'
}
//obj2想访问obj.a,且可以修改obj.a的值
//给obj2新增属性a
//get中返回obj.a,即obj2新增的属性a拿的是obj.a的值
//set中修改,当obj2.a值发生改变的时候,再赋值给obj.a,再触发get,obj2.a再去拿obj.a的值
Object.defineProperty(obj2,'a',{
get(){
return obj.a
}
set(value){
obj.a= value
}

第一篇结束~~~

相关文章:

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇,对于基础的知识点,我感觉自己还是很薄弱的。 趁着假期,再去复习一遍 Object.defineProperty(),对于这个方法,更多的还是停留在面试的时候,面试官问你vue2和vue3区别的时候,不免要提一提这个方法…...

Linux 磁盘管理

Linux 系统的磁盘管理直接关系到整个系统的性能表现。磁盘管理常用三个命令为: df、du 和 fdisk。 df df(英文全称:disk free)。df 命令用于显示磁盘空间的使用情况,包括文件系统的挂载点、总容量、已用空间、可用空间…...

大数据与人工智能的未来已来

大数据与人工智能的定义 大数据: 大数据指的是规模庞大、复杂性高、多样性丰富的数据集合。这些数据通常无法通过传统的数据库管理工具来捕获、存储、管理和处理。大数据的特点包括"3V": 大量(Volume):大数…...

【AI视野·今日Robot 机器人论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 26 Sep 2023 Totally 73 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Extreme Parkour with Legged Robots Authors Xuxin Cheng, Kexin Shi, Ananye Agarwal, Deepak Pathak人类可以通过以高度动态…...

[NOIP2012 提高组] 开车旅行

[NOIP2012 提高组] 开车旅行 题目描述 小 A \text{A} A 和小 B \text{B} B 决定利用假期外出旅行,他们将想去的城市从 $1 $ 到 n n n 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 …...

数据库设计流程---以案例熟悉

案例名字:宠物商店系统 课程来源:点击跳转 信息->概念模型->数据模型->数据库结构模型 将现实世界中的信息转换为信息世界的概念模型(E-R模型) 业务逻辑 构建 E-R 图 确定三个实体:用户、商品、订单...

Miniconda创建paddlepaddle环境

1、conda env list 2、conda create --name paddle_env python3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 3、activate paddle_env 4、python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 5、pip install "p…...

postgresql实现单主单从

实现步骤 1.主库创建一个有复制权限的用户 CREATE ROLE 用户名login # 有登录权限的角色即是用户replication #复制权限 encrypted password 密码;2.主库配置开放从库外部访问权限 修改 pg_hba.conf 文件 (相当于开放防火墙) # 类型 数据库 …...

提取PDF数据:Documents for PDF ( GcPdf )

在当今数据驱动的世界中,从 PDF 文档中无缝提取结构化表格数据已成为开发人员的一项关键任务。借助GrapeCity Documents for PDF ( GcPdf ),您可以使用 C# 以编程方式轻松解锁这些 PDF 中隐藏的信息宝藏。 考虑一下 PDF(最常用的文档格式之一…...

adb连接切换到模拟器端口

查看连接状态 adb devices出现以下情况 C:\Users\22560>adb devices List of devices attached 127.0.0.1:5555 offline emulator-5554 device可以发现我们想要连接的雷电模拟器的5555端口目前没有连接,只有emulator-5554被连接了,此时我们需要关…...

为何每个开发者都在谈论Go?

目录 一、引言Go的历史回顾关键时间节点 使用场景Go的语言地位技术社群与企业支持资源投入和生态系统 二、简洁的语法结构基本组成元素变量声明与初始化代码示例 类型推断函数与返回值代码示例输出 接口与结构体:组合而非继承错误处理:明确而不是异常小结…...

【Leetcode】 501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…...

怎样给Ubuntu系统安装vmware-tools

首先我要告诉你:Ubuntu无法安装vmware-tools,之所以这么些是因为我一开始也是这样认为的,vmware-tools是给Windows系统准备的我认为,毕竟Windows占有率远远高于Linux,这也可以理解。 那么怎么样实现Ubuntu虚拟机跟Wind…...

DDS信号发生器波形发生器VHDL

名称:DDS信号发生器波形发生器 软件:Quartus 语言:VHDL 要求: 在EDA平台中使用VHDL语言为工具,设计一个常见信号发生电路,要求: 1. 能够产生锯齿波,方波,三角波&…...

Python3操作SQLite3创建表主键自增长|CRUD基本操作

Win11查看安装的Python路径及安装的库 Python PEP8 代码规范常见问题及解决方案 Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter Python函数绘…...

B. Comparison String

题目&#xff1a; 样例&#xff1a; 输入 4 4 <<>> 4 >><< 5 >>>>> 7 <><><><输出 3 3 6 2 思路&#xff1a; 由题意&#xff0c;条件是 又因为要使用尽可能少的数字&#xff0c;这是一道贪心题&#xff0c;所以…...

python端口扫描

扫描所有端口 import socket, threading, os, timedef port_thread(ip, start, step, timeout):for port in range(start, start step):s socket.socket()s.settimeout(timeout)try:s.connect((ip, port))print(f"port[{port}] 可用")except Exception as e:# pri…...

国庆第二天

#include<th.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\ }while(0)#define PORT 6666 #define IP "192.168.2.3"//键盘输入事件 int serverkeyboard(fd_set readfds) {char buf[128] "";int sndfd -…...

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…...

2023年第二十届中国研究生数学建模竞赛总结与分享

今天是国庆节&#xff0c;祝祖国繁荣富强。正好也学习不下去&#xff0c;就想着写写博客&#xff0c;总结一下自己在参加2023年第20届中国研究生数学建模比赛的一些感受。 目录 1.基本介绍 2.比赛分享 1.基本介绍 1. 竞赛时间&#xff1a;竞赛定于2023年9月22日8:00至2023年9…...

AArch64虚拟化调试:HDFGWTR2_EL2寄存器详解与应用

1. AArch64系统寄存器与虚拟化调试概述在Armv8/v9架构中&#xff0c;系统寄存器是处理器核心的控制中枢&#xff0c;负责管理处理器的各种关键功能和行为。AArch64架构通过异常级别&#xff08;EL0-EL3&#xff09;实现了严格的权限分级机制&#xff0c;其中EL2作为Hypervisor层…...

QQ音乐加密音频一键解密:3步让Mac用户重获音乐自由

QQ音乐加密音频一键解密&#xff1a;3步让Mac用户重获音乐自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换…...

AI实时翻译实现BurpSuite中文界面(无需修改源码)

1. 这不是简单的“改个语言”&#xff0c;而是BurpSuite中文生态的破冰点你有没有在刚打开BurpSuite时&#xff0c;面对满屏英文菜单、弹窗提示和错误日志&#xff0c;下意识地去翻找Settings → User Interface → Language&#xff0c;却发现下拉框里只有English、Franais、D…...

Unity地形草刷不上?根源是单顶点Mesh硬限制

1. 问题不是“刷不上去”&#xff0c;而是Unity地形系统对Mesh草的底层限制逻辑被误解了“Unity地形使用Mesh网格刷草刷不上”——这句话在Unity社区里每年至少被重复提问3000次以上。我第一次遇到它是在2019年做一款开放世界生存游戏时&#xff0c;美术同事把精心建模的蒲公英…...

SpinalHDL流水线设计:从概念到实战的高效硬件开发

1. 项目概述&#xff1a;从“硬连线”到“流水线”的思维跃迁在数字电路设计领域&#xff0c;尤其是使用高级硬件描述语言&#xff08;HDL&#xff09;进行复杂系统开发时&#xff0c;性能瓶颈往往不在于逻辑功能的实现&#xff0c;而在于如何高效地组织数据流&#xff0c;让电…...

Arty S7 FPGA开发板实战指南:从硬件解析到项目开发

1. 项目概述&#xff1a;为什么是Arty S7&#xff1f;如果你是一名嵌入式开发者、数字电路设计爱好者&#xff0c;或者正在寻找一块能兼顾学习、原型验证和低成本部署的FPGA开发板&#xff0c;那么Digilent的Arty S7系列很可能已经进入了你的视野。我最初接触这块板子&#xff…...

告别CNN局部视野:用UNETR的Transformer编码器搞定三维医学图像分割(附PyTorch+MONAI实战)

突破CNN局限&#xff1a;UNETR在三维医学图像分割中的Transformer实践指南 医学图像分割一直是计算机辅助诊断系统中的核心环节&#xff0c;从肿瘤定位到器官轮廓勾画&#xff0c;精准的分割结果直接影响后续分析的可靠性。传统基于CNN的方法虽然在2D图像处理中表现出色&#x…...

从V2L到V2G:深度解析双向OBC的HIL测试如何模拟真实用车场景(含CANoe SmartCharging配置)

从露营供电到电网互动&#xff1a;双向OBC的HIL测试实战指南 清晨的山谷里&#xff0c;一辆新能源车静静停驻在营地旁。车主取出便携式电烤盘&#xff0c;将充电枪插入车辆交流充电口&#xff0c;几分钟后烤盘上的牛排开始滋滋作响——这看似简单的场景背后&#xff0c;是双向O…...

MediaCrawler:企业级社交媒体数据采集的终极架构实践

MediaCrawler&#xff1a;企业级社交媒体数据采集的终极架构实践 【免费下载链接】MediaCrawler 小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 &#xff5c; 评论爬虫、微博帖子 &#xff5c; 评论爬虫、百度贴吧帖子 &#xff5c; 百度贴吧评论…...

终极指南:为VSCode换上节日主题图标,圣诞节、万圣节等季节性装饰一键搞定

终极指南&#xff1a;为VSCode换上节日主题图标&#xff0c;圣诞节、万圣节等季节性装饰一键搞定 【免费下载链接】vscode-icons Custom Visual Studio Code Icons 项目地址: https://gitcode.com/gh_mirrors/vsc/vscode-icons vscode-icons是一款为Visual Studio Code提…...