笑看尘世|学习Vue3.0,先来了解一下Proxy( 五 )
对比Vue2.0其实与$set解决的问题类似 , Vue2.0是无法监听到属性被删除的 , 所以提供了$delete用于删除属性 , 但是对于Proxy , 是可以监听删除操作的 , 所以就不需要再使用$delete了
其他操作在上文中 , 我们提到了Proxy的handler提供了十三个函数 , 在上面我们列举了最常用的三个 , 其实每一个的用法都是基本一致的 , 比如ownKeys , 当通过Object.getOwnPropertyNames,Object.getownPropertySymbols,Object.keys,Reflect.ownKeys去获取对象的信息的时候 , 就会进入ownKeys这个钩子函数 , 使用这个我们就可以对一些我们不想暴露的属性进行保护 , 比如一般会约定_开头的为私有属性 , 所以在使用Object.keys去获取对象的所有key的时候 , 就可以把所有_开头的属性屏蔽掉 。 关于剩余的那些属性 , 建议大家多去看看MDN中的介绍 。
Reflect在上面 , 我们获取属性的值或者修改属性的值都是通过直接操作target来实现的 , 但实际上ES6已经为我们提供了在Proxy内部调用对象的默认行为的API,即Reflect 。 比如下面的代码
const obj = {}const proxy = new Proxy(obj, {get(target,key,receiver) {return Reflect.get(target,key,receiver)}})大家可能看到上面的代码与直接使用target[key]的方式没什么区别 , 但实际上Reflect的出现是为了让Object上面的操作更加规范 , 比如我们要判断某一个prop是否在一个对象中 , 通常会使用到in,即
const obj = {name: '子君'}console.log('name' in obj)但上面的操作是一种命令式的语法 , 通过Reflect可以将其转变为函数式的语法 , 显得更加规范
Reflect.has(obj,'name')除了has,get之外 , 其实Reflect上面总共提供了十三个静态方法 , 这十三个静态方法与Proxy的handler上面的十三个方法是一一对应的 , 通过将Proxy与Reflect相结合 , 就可以对对象上面的默认操作进行拦截处理 , 当然这也就属于函数元编程的范畴了 。
总结有的同学可能会有疑惑 , 我不会Proxy和Reflect就学不了Vue3.0了吗?其实懂不懂这个是不影响学习Vue3.0的 , 但是如果想深入 去理解Vue3.0 , 还是很有必要了解这些的 。 比如经常会有人在使用Vue2的时候问 , 为什么我数组通过索引修改值之后 , 界面没有变呢?当你了解到Object.defineProperty的使用方式与限制之后 , 就会恍然大悟 , 原来如此 。
作者:前端进击者
转发链接:
推荐阅读
- 上海市交通委员会|市交通委党组参加《民法典》学习会
- Java|计算机专业的本科生,该选择学习Java技术体系还是.NET技术体系
- 时尚穿搭生活馆|40、50岁女人就别穿“大妈装”了!学习博主减龄穿搭,洋气又减龄
- 消除"学历歧视",鹰视教育助力全民终身学习教育体系建设
- 美容|提升女人味的秋季妆容,一定要学习
- 上海虹口门户网站|区科委党委运用“O2O”模式开展“四史”学习教育
- 笑看尘世|Spring4基础二二-AOP篇-通知(2)-通知详解
- 轻拔琴弦|非常强大,硬核!微软云K8S学习指南免费领取了
- 学霸|他是哈佛、耶鲁学霸。他坦言:拉开人生距离的,是这些学习方法
- 澎湃新闻|如何教孩子防性侵知识?边看动画边学习
