proxy的理解及proxy为什么可以监听数组?_proxy为什么能监听数组变化-程序员宅基地

技术标签: proxy  vue  

vue3.0发布后,在双向数据绑定这里,使用proxy代替了object.defineProperty,众所周知,obj.defineProperty是对对象属性监听,循环对象,一个个属性监听,proxy是对一整个对象进行监听。而proxy的一大优势就是可以监听数组。此帖用来记录自己对proxy的调研理解。

1,proxy的基本理解

proxy是es6中的语法,最为代理的功能,当外接要访问对象的时候,proxy可以做一层拦截,并且可以对这个proxy代理进行操作,进而实现对对象的操作。如:

var proxy = new Proxy(obj, handler)

这里定义的proxy作为obj的代理,handler也是个对象,在这里进行操作,proxy和obj始终保持状态一直,proxy进行了什么操作之后,obj同样做出改变,是一个对obj全对象的监听。目前有14拦截操作,具体可看es6文档。

2,proxy和reflect关系

reflect也是es6的语法,再proxy使用中常用到reflect,reflect有14中方法,对应proxy是一样的,但是这俩其实没关系,只是搭配着使用,proxy用来拦截,reflect用来操作。

var obj = {
    
    a: 1,
    c: 3
};
var proxy = new Proxy(obj, {
    
    get: function(target, key, receiver) {
    
        console.log('get的key为 ===>' + key);
        return Reflect.get(target, key, receiver);
    },
    set: function(target, key, value, receiver) {
    
        console.log('set的key和value为 ===>' + key, value);
        return Reflect.set(target, key, value, receiver);
    }
});
proxy.b         //get的key为 ===>b
proxy.a  = 5   //set的key和value为 ===>a 5
proxy.b = 2    //set的key和value为 ===>b 2

第一个proxy.b,没有赋值操作直接点一个属性,这时候走的就是get方法,Reflect返回的就是key,也就是b。
第二个给代理对象proxy的a复制5,走的就是set方法,里面的Reflect.set是把value值赋给当前对象的key,就是把5赋给a。

3,为什么可以监听数组

运行下面代码:

  let arr = [1,2,3]
  let proxy = new Proxy(arr, {
    	
 	get: function (target, key, receiver) {
    
         console.log('get的key为 ===>' + key);
         return Reflect.get(target, key, receiver);
     },
     set(target, key, value, receiver){
    
         console.log('set的key为 ===>' + key, value);
         return Reflect.set(target, key, value, receiver);
     }
 })
 proxy[0]          // set的key为 ===>0
 proxy[3] = 12     // set的key为 ===>3  12

可以看到,和上面obj的时候结果一样,key值是索引,如果使用数组的方法呢?

proxy.push('2')
// get的key为 ===>push
// get的key为 ===>length
// set的key为 ===>3 2
// set的key为 ===>length 4
console.log(proxy, 'proxy的length=' + proxy.length)
console.log(arr, 'arr的length=' + arr.length)
// get的key为 ===>length
// Proxy {0: 1, 1: 2, 2: 3} "proxy的length=3"
//  [1, 2, 3] "arr的length=3"

可以看到,get方法走了两边,set方法走了两边。因为push方法其实做了两步,第一是再length出加上push的值,第二是把length加一,所以走了两边。

原因:
从代码执行上看,确实是可以监听数组,分析下,首先,数组其实也是对象,从 typeof方法可以看出来,不然,数组也不能使用.length,[0],.push()等,如果把数组写成类数组对象,就好理解多了。

let objArr = {
    
	'0': 1,
	'1': 2,
	length: 2,
	push: Array.prototype.push(),
	...
}

从console的结果所以可以看出,这里的proxy就是个类数组。那么可以猜想,如果proxy第一个参数传的是数组时,proxy就会转化成类数组,也可以调用数组的方法,length、push等,找不到的方法就去原型链上找。

所以,如果数组长度改变,key值就是length,调用push等方法,key就是push。这样一切就理的通了。当然这也是我个人再学习proxy时候的一些理解,也或许是这样或许不是这样,但我这样去理解确实会明白多,如果不对的话希望大家看了之后可以纠正指点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43574780/article/details/108042951

智能推荐

[leetcode] 173. Binary Search Tree Iterator_implement an iterator over a binary search tree (b-程序员宅基地

文章浏览阅读131次。DescriptionImplement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.Calling next() will return the next smallest number in the BST.Exampl..._implement an iterator over a binary search tree (bst)

小米OJ #18 帮小学生排队_在我家地下出现了h次数-程序员宅基地

文章浏览阅读562次。原题还蛮有意思的一道题,先要理解题目给的输入:h和k是一对一对给的,因此对每位小朋友位置进行变动的时候,h,k应是一起变动。(一开始理解成了h,k混着给,想了半天没想出思路)用两个数组同步保存h,k,再利用第三个数组保存h,k的索引。首先进行一次排序:h值大的在前;h值相同的,则k值更小的在前。随后可以发现,每对hk的正确位置应该是插入到 距离其当前位置向前(pos-k)个长度的位置。利..._在我家地下出现了h次数

aardio - 【库】zint生成二维码条形码_zint条码-程序员宅基地

文章浏览阅读762次,点赞3次,收藏5次。aardio-【库】zint生成二维码条形码_zint条码

库_计算机库-程序员宅基地

文章浏览阅读1.2k次。库【1】库的概念1.什么是库库是一个二进制可执行的文件。库需要被载入到内存中才能使用相比较可执行的二进制程序,库是不能单独运行的。windows和linux都有自己的库,不兼容的。2.库的分类1.动态库(共享库)2.静态库区分:通过库的后缀来区分库的类型windowslinux静态库*.lblibxxx.a动态库*.lldlibxxx.so3.库存在的意义库是已经写好的,成熟的,可以复用的代码。其实我们写的很多代码,都是依赖于基础库的,_计算机库

CSS属性中可以继承的有,css中可以继承的属性都有哪些?-程序员宅基地

文章浏览阅读2.7k次。所有元素可继承:visibility、cursor。内联元素可继承:letter-spacing、word-spacing、white-space、line-height、color、font、font-family、font-size、font-style、font-variant、font-weight、text-decoration、text-transform、direction。终端块状..._css继承属性有哪些

Failed to load JavaHL Library._javhl-程序员宅基地

文章浏览阅读379次。安装好svn后,把项目提交到svn的过程中,总是弹出来一个错误的对话框: Failed to load JavaHL Library. These are the errors that were encountered: 从网上查看了一下解决办法, 1.选择window--->preferences->Team->SVN->SVN接口 2.选择SVNKit (Pure J_javhl

随便推点

灵魂拷问!程序猿老司机才知道的IT网站,你都知道几个?_拷问网战-程序员宅基地

文章浏览阅读2.6k次。 程序猿是这个世界上最神秘的职业之一,他们能够用最原始的文字符号,书写出最复杂的程序。因此他们自成圈子,交流、学习、分享、进阶都自成一“国”,渐渐的就成了外人眼里的沉默寡言。可是事实上,在你不知道的另一端,他们可劲的“浪”着呢~今天小泽就给大家介绍下国内外程序员们最爱逛的网站,上次华住资料泄露的事就是在这些网站里爆出来的呢~1、stackoverflow众所周知,stackover..._拷问网战

点云从入门到精通技术详解100篇-基于深度学习的三维植物点云分割网络(续)-程序员宅基地

文章浏览阅读139次。另外,对比三种作物的茎干定量指标后可以发现单子叶的高粱是最差的,主要原因是高粱的茎干和叶片都是 细长型的,叶片端部与主茎形状非常相似,对网络的分割带来了较大挑战,容 易导致将茎干错分割成叶片。Prec反映了该类分类正确的点数占网络预测出该类的全部点数的比例,Rec反映了 该语义类分类正确的点数占真实值标签中该类总点数的比例,IoU反映每个语 义类的预测区域与其真实区域的重合程度,F1是一个综合性指标,是Prec和 Rec的调和平均数。在三 种作物中,高粱作物的整体实例分割指标结果是最差的。

HDFS详解-程序员宅基地

文章浏览阅读1.3w次,点赞10次,收藏54次。******HDFS基本概念篇******1. HDFS前言设计思想分而治之:将大文件、大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析;在大数据系统中作用:为各类分布式运算框架(如:mapreduce,spark,tez,……)提供数据存储服务重点概念:文件切块,副本存放,元数据2. HDFS的概念和特性首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件其次,它是分布式的,由很多服务器联合起来实现其_hdfs

SDH8323非隔离12V/15V/18V 300MA DIP7开关电源AC-DC芯片-程序员宅基地

文章浏览阅读259次。SDH8323 在轻载条件下降频工作,优化轻载条件下的转换效率。在极轻载及空载条件下工作于打嗝模式,从而有效地降低系统的待机功耗。SDH8323 是高压启动,内置高压MOSFET的电流模式PWM+PFM控制器,适用于Buck及Buck-Boost拓扑。SDH8323 内部集成了全面的异常状态保护功能,包括VDD欠压保护,VDD过压保护,前沿消隐,过流保护,过温保护等。SDH8323 可通过管脚配置输出电压,12V/15V/18V输出电压可选。12V,15V,18V输出电压三档可调。VDD过压/欠压保护。_sdh8323

C++代码规范-程序员宅基地

文章浏览阅读5.3k次,点赞10次,收藏103次。文章目录一、命名规范1、目录/文件2、函数/接口3、命名空间4、结构体/类5、变量(1)局部变量(2)全局变量(3)静态变量(4)类成员变量(5)类静态变量(6)常量5、宏定义6、枚举一、命名规范对于C++代码,每个人的风格和习惯各不尽相同,但是为了在项目中形成一个统一的,阅读性比较好的代码,这里参考了主要的开源代码、国内外各大厂以及以往的项目经验,这里对C++代码的命名进行了一个约定规范。1、目录/文件规范:使用小写字母、数字、下划线,多个单词间用下划线分隔。原因:Windows对目录和文件是大_c++代码规范

IT运维存在问题及改进_it工作不足-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏6次。IT运维管理可能存在的问题1.1 IT运维机制不完善,流程操作层面缺乏统一没有建立起稳定、规范的IT运维机制。现有的IT运维流程的操作层面缺乏统一。如事件单提交之后,事件预判和优先级的设定缺少统一、规范的指导文档,仅以人员的主观经验或约定俗成的方式指导事件的处理过程。有识别但无规范,有处理但无管理,有人员但忙于救火,有工具但支持力度不足。因此,“轻规范、重维护”的IT运维现状容易造成因个体技能差异带来IT运维的不稳定,直接影响维护体系的效果。1.2 经验不少,知识不多,过度依赖核心人员在实际工作中积_it工作不足

推荐文章

热门文章

相关标签