关于proxy的较深入研究

news2024/11/23 22:44:56

关于proxy的较深入研究

  • proxy是什么
  • 控制台打印proxy,展示一下
  • vue3中的prxoy和es6的proxy有何不同?
  • proxy对js和vue3来说有什么含义?
  • proxy的封装机制

proxy是什么

Proxy是ES6中新增的一个对象,它可以用来代理另一个对象,可以对目标对象的访问进行拦截和修改。

使用Proxy可以监听对象的访问、修改、删除等操作,并且可以在这些操作发生时执行一些自定义的逻辑。这使得我们可以更好地控制对象的行为,从而实现一些高级的功能,例如数据绑定、状态管理、事件触发等等。

Proxy的语法如下:

const proxy = new Proxy(target, handler)

其中,target表示要代理的目标对象,handler表示一个对象,它定义了拦截目标对象各种操作的方法。handler中的方法称为“拦截器”,例如get、set、deleteProperty等等。

以监听对象属性访问为例,我们可以使用get拦截器来实现:

const person = {
  name: '张三',
  age: 18
}

const handler = {
  get(target, key) {
    console.log(`访问了${key}属性`)
    return Reflect.get(target, key)
  }
}

const proxy = new Proxy(person, handler)

console.log(proxy.name) // 访问了name属性,输出Tom
console.log(proxy.age) // 访问了age属性,输出18

在这个例子中,我们使用Proxy代理了一个普通的JavaScript对象person,并在handler中实现了get拦截器,当访问person对象的属性时,会自动调用这个拦截器并输出一些信息,然后返回属性的值。

总之,Proxy是一个非常强大的特性,它可以帮助我们更好地控制对象的行为,从而实现一些高级的功能。


控制台打印proxy,展示一下

我们可以创建了一个名为 proxy 的代理对象,并覆盖了其 get 和 set 方法。当我们设置或获取 proxy 对象的属性时,会自动触发相应的方法并打印出信息。

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	
	<script>
		const proxy = new Proxy({}, {
		  get: function(target, prop) {
		    console.log(`Getting property ${prop}`);
		    return target[prop];
		  },
		  set: function(target, prop, value) {
		    console.log(`Setting property ${prop} to ${value}`);
		    target[prop] = value;
		    return true;
		  }
		});
		
		proxy.name = '张三'; 
		console.log(proxy.name); 
		console.log(proxy);
	</script>
</body>
</html>

那么我们在控制台会发现proxy对象
在这里插入图片描述在js 中,代理对象是一个可以拦截并自定义基本操作的对象。代理对象有很多方法和属性,以下是一些常见的方法和属性:

  • get(target, prop, receiver)
    拦截对代理对象属性的读取操作。
  • set(target, prop, value, receiver)
    ‘拦截对代理对象属性的写入操作。
  • apply(target, thisArg, argumentsList)
    拦截对函数调用的操作。
  • construct(target, argumentsList, newTarget)
    拦截对构造函数的调用。
  • has(target, prop)
    判断代理对象是否有某个属性。
  • deleteProperty(target, prop)
    删除代理对象上指定的属性。
  • ownKeys(target)
    返回一个包含所有自身属性名称(不包括继承来的)的数组。

除了以上这些方法之外,还有许多其他方法和特殊属性,如:

getPrototypeOf()
setPrototypeOf()
isExtensible()
preventExtensions()
defineProperty()
getOwnPropertyDescriptor()

这些方法和特殊属性可以帮助我们在创建代理对象时实现更加灵活和高级的行为。


vue3中的prxoy和es6的proxy有何不同?

在Vue3中,Proxy是Vue3内部使用的一个对象,它和ES6中的Proxy是有所不同的。

Vue3中,Proxy被用来实现响应式数据的追踪和更新。当我们使用reactive或ref函数创建响应式数据时,Vue3内部会使用Proxy对这些数据进行代理,并在数据发生变化时自动触发相关的更新操作。

这种代理机制可以帮助我们更好地追踪数据的变化,并且可以避免一些不必要的更新操作,从而提高程序的性能。

以reactive函数为例,它的实现原理如下:

function reactive(target) {
  // 使用Proxy对目标对象进行代理
  const proxy = new Proxy(target, {
    get(target, key) {
      // 在获取属性时收集依赖
      track(target, key)
      return Reflect.get(target, key)
    },
    set(target, key, value) {
      const oldValue = target[key]
      if (oldValue !== value) {
        // 在设置属性时触发更新
        Reflect.set(target, key, value)
        trigger(target, key)
      }
      return true
    }
  })
  return proxy
}

在这个例子中,我们使用Proxy对目标对象进行代理,并在get和set拦截器中分别实现了依赖追踪和更新触发的逻辑。当我们访问或修改代理对象的属性时,就会自动触发这些拦截器,并且会自动调用相关的更新操作。

总之,Vue3中的Proxy和ES6中的Proxy有所不同,它被用来实现响应式数据的追踪和更新,并且可以帮助我们更好地控制数据的变化和更新。

总结不同之处为三点:

用途不同:
ES6中的Proxy主要用来代理普通的JavaScript对象,可以在访问或修改对象属性时拦截并执行一些自定义的逻辑。而Vue3中的Proxy主要用来实现响应式数据的追踪和更新,可以在数据发生变化时自动触发相关的更新操作。

实现方式不同:
ES6中的Proxy是一个原生的JavaScript对象,需要使用ES6的语法来创建和使用。而Vue3中的Proxy是Vue3内部实现的一个对象,我们无法直接访问和使用它。

用法不同:
ES6中的Proxy需要手动创建和使用,需要定义一个handler对象来实现拦截器。而Vue3中的Proxy是自动创建和使用的,我们只需要使用reactive或ref函数来创建响应式数据,就可以自动获得Proxy的功能。


proxy对js和vue3来说有什么含义?

对于JavaScript来说,Proxy是一个非常强大的特性,它可以帮助我们更好地控制对象的行为,从而实现一些高级的功能,例如数据绑定、状态管理、事件触发等等。在Vue3中,Proxy被用来实现响应式数据的追踪和更新,这使得我们可以更好地追踪数据的变化,并且可以避免一些不必要的更新操作,从而提高程序的性能。

对于JavaScript和Vue3来说,Proxy的作用如下:

实现数据响应式:在Vue3中,使用Proxy代理响应式数据,可以自动追踪数据的变化并且自动触发相关的更新操作,从而实现数据的响应式。

实现数据绑定:在JavaScript中,使用Proxy可以拦截对象的访问和修改,从而实现数据的绑定,当数据发生变化时,相关的组件会自动更新。

实现状态管理:在Vue3中,使用Proxy可以实现一些高级的状态管理功能,例如状态共享、状态合并、状态持久化等等。

实现事件触发:在JavaScript中,使用Proxy可以拦截对象的方法调用,从而实现事件的触发和监听,当事件发生时,相关的回调函数会自动执行。

总之,对于JavaScript和Vue3来说,Proxy是一个非常重要的特性,它可以帮助我们更好地控制对象的行为,从而实现一些高级的功能。

proxy的封装机制

在Vue3中,Proxy是一个偏底层的东西,它被用来实现响应式数据的追踪和更新,是Vue3响应式系统的核心之一。

Vue3内部使用Proxy对响应式数据进行代理,从而可以自动追踪数据的变化,并且可以自动触发相关的更新操作。在代理过程中,Vue3内部封装了一些机制,例如依赖追踪、更新队列等等,这些机制可以帮助我们更好地控制数据的变化和更新。

具体来说,Vue3内部封装的机制如下:

依赖追踪:在获取响应式数据的属性时,Vue3会自动收集相关的依赖关系,从而可以在数据发生变化时自动触发相关的更新操作。

延迟更新:在数据发生变化时,Vue3会将相关的更新操作添加到更新队列中,然后等待下一个事件循环周期再执行更新操作,从而避免一些不必要的更新操作。

批量更新:在更新队列中可能存在多个更新操作,为了提高性能,Vue3会将它们合并成一个更新操作,然后一次性执行。

嵌套更新:在更新操作中可能会触发另一个更新操作,为了避免死循环,Vue3会限制最大的更新深度,并且在超过深度限制时抛出错误。

总之,Vue3内部封装了一些机制来支持响应式数据的追踪和更新,这些机制可以帮助我们更好地控制数据的变化和更新,并且可以提高程序的性能。

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

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

相关文章

微服务eureka和nacos

服务远程调用 /*** 创建RestTemplate并注入Spring容器* return*/Beanpublic RestTemplate restTemplate(){return new RestTemplate();} Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.fin…

关于调试别人的bug中发现的细节问题1:Switch...case...分支,永远只选择第一个分支

1、Switch…case…分支&#xff0c;永远只选择第一个分支&#xff1a; 原因&#xff1a;switch()里面的不是传入的变量&#xff0c;m_curWindowType是个成员变量&#xff0c;一直是初始值。他喵的&#xff0c;不知道谁写的下面的代码&#xff0c;大晚上的我也没有细看&#xff…

13.3寸_Wifi标签功耗电流计算-单面屏幕-1.8V的Flash测试

13.3寸Wifi标签不工作的时候电流的消耗主要来自两部分&#xff1a; 待机时&#xff0c;醒来监听时。经过测量&#xff0c;13.3寸Wifi标签的待机电流是7.13uA , 醒来监听的峰值电流是51.6 mA。13.3寸Wifi标签系统设定每间隔1秒醒来一次监听是否有唤醒数据。充电锂电池电池的容量…

00后跳槽到我们公司拿了25K,“躺平”两个字骗了我好久···

都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。前段时间我们部门就来了个00后&#xff0c;工作都还没两年&#xff0c;跳到我们公司起薪25K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最近和他…

【配置环境】Windows下C/C++第三方库管理工具vcpkg安装和使用

一&#xff0c;vcpkg简介 vcpkg是微软公司开发的一个开源C包管理工具&#xff0c;它可以很方便的帮助您在 Windows、 Linux 和 MacOS 上下载&#xff0c;编译和安装C 第三方库。它具有自动解决依赖关系的能力&#xff0c;并且支持多种目标架构和平台。提供了超过1500个C库的预…

架构师基础篇之如何画架构图C4模型

1. 前言 本文将给大家介绍一种简洁明了软件架构可视化模型——C4模型&#xff0c;并手把手教大家如何使用代码绘制出精美的C4架构图。 阅读本文之后&#xff0c;读者画的架构图将会是这样的&#xff1a; 注&#xff1a;该图例仅作绘图示例使用&#xff0c;不确保其完整性、可…

❤ 关于以太网没有有效的ip配置问题解决方法

❤ 关于以太网没有有效的ip配置问题解决方法 错误提示 解决方法 一&#xff0c;检查IP地址是否为自动获取 1&#xff0c;首先右键任务栏右下角的网络图标点击进入"网络和共享中心",然后点击"更改适配器设置"。 2&#xff0c;在适配器界面右键"本…

异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测

文章目录 文章概述模型描述源码分享学习小结文章概述 异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测 模型描述 IsolationFores算法它是一种集成算法(类似于随机森林)主要用于挖掘异常(Anomaly)数据,或者说离群点挖掘,总之是在一大堆数据中,找出与其它数据…

***杨辉三角_yyds_LeetCode_python***

1.题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows …

第3章“程序的机器级表示”:异类的数据结构

文章目录 概述3.9.1 结构3.9.2 联合 概述 C提供了两种将不同类型的对象结合到一起来创建数据类型的机制&#xff1a;结构&#xff08;structure&#xff09;&#xff0c;用关键字 struct 来声明&#xff0c;将多个对象集合到一个单位中&#xff1b;联合&#xff08;union&…

Java网络开发(Asynchronous)—— 从 Jsp 到 Ajax 的 axios 到 vue 同步请求 到 异步请求

目录 引出如果想做bilibili边看视频边评论怎么搞&#xff1f;Ajax是啥&#xff1f;& axios的语法1. Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;简介2. axios语法 及其与 java后端交互&#xff08;1&#xff09;get请求&#xff08;2&#xff09;post请求…

SpringBoot之Spring Data JPA入门学习

JPA&#xff08;Java Persistence API&#xff09;Java持久化API&#xff0c;是 Java 持久化的标准规范&#xff0c;Hibernate是持久化规范的技术实现&#xff0c;而Spring Data JPA是在 Hibernate 基础上封装的一款框架。 一、添加依赖 <dependency><groupId>or…

【git指南--命令大全】

我看好多文章命令都记录得比较发散不够全面&#xff0c;这里还是把我自己的笔记分享出来&#xff0c;方便查阅。 文章目录 1. git config作用域--list 显示当前所有配置配置cd ~/.ssh 2. 初始化 git 仓库1、把已有项目代码纳入 git 管理2、新建的项目直接用git 管理3、克隆仓库…

智能指针 smart_ptr

智能指针 为什么需要智能指针&#xff1f;内存泄漏什么是内存泄漏&#xff0c;内存泄漏的危害内存泄漏分类 智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptr 为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内…

ps打开出现dll文件丢失怎么办,dll修复的三个方法

在Windows中&#xff0c;动态链接库&#xff08;DLL&#xff09;是一种可重用的代码和数据结构&#xff0c;它由多个应用程序共享&#xff0c;以提高内存利用率并减少冗余。DLL文件通常包含操作系统函数、图形驱动程序、网络驱动程序等&#xff0c;它们在Windows启动时被加载到…

大话Stable-Diffusion-Webui-客制化主题(四)

文章目录 目标效果开始重要说明单选框以及复选框图标样式更改gradio主题构建器上传主题方式代码上传主题方式目标 在DIY的主题中更改gradio单选框组件以及复选框组件的勾选后图标样式 效果 开始 笔者在使用gradio的主题构建器的过程中发现,gradio的复选框以及单选框组件勾选…

高通 Camera HAL3:如何在CAMX中查找Android TAG

之前的博文&#xff1a;《高通 Camera HAL3&#xff1a;添加一个VendorTag》中提到过&#xff0c;MetadataTag在CamX中有两种体现&#xff0c;可以是预定义的AndroidTag或是自定义VendorTag。 自定义VendorTag博文中已经讲解了 如何在CAMX中查找AndroidTag是经常要做的事 下…

【2】Midjourney注册

随着AI技术的问世&#xff0c;2023年可以说是AI爆炸性成长的一年&#xff0c;近期最广为人知的AI服务除了chatgpt外&#xff0c;就是从去年五月就已经问世的AI绘画工具mid journey了。 ▲几个AI工具也代表了人工智能的热门阶段 只要输入一段文字&#xff0c;AI就会根据语意计算…

Android 逆向之安全防护基本策略

对抗反编译 混淆 使用混淆主要可以减小包的大小。混淆对于安全保护来说&#xff0c;只是增加了阅读难度而已。混淆不会把关键代码混淆掉&#xff0c;比如MainActivity&#xff0c;Application等&#xff0c;可以通过分析smali和阅读jar包定位代码。 资源混淆也是换汤不换药&…

【VPX612】基于C6678 的6U VPX 实时信号处理平台

产品概述 VPX612 是一款基于6U VPX 架构的高性能实时信号处理平台&#xff0c;该平台采用4 片TI 的KeyStone 系列多核DSP TMS320C6678 作为主处理单元&#xff0c;采用1 片Xilinx 的Kintex-7 系列FPGA 作为协处理单元&#xff0c;各个处理节点之间通过高速串行总线进行互联。板…