的确写Proxy文章很多,那么今天我也不凑字数了,炒两个栗子吧。

一、虚拟属性

  const person = {name: 'xiaoyun',province: '江苏省',city: '南京市'}
复制代码

对于上述对象,我们可能需要地址信息(由省市拼接而成),在此之前我们可能会采取下列方式:

  • 直接在person对象上声明一个address属性;
  • 当用到address信息时,再通过person拼接。

第一个方法的主要弊端是污染了原有的对象,而第二种方法就很不灵活。现在我们可以通过Proxy实现比较好的效果:

  const enhancePerson = new Proxy(person, {get (target, name) {switch (name) {case 'address':return `${target['province']}-${target['city']}`default:return target[name]}}})enhancePerson.address // 江苏省-南京市
复制代码

通过这种方式我们就可以实现虚拟属性了,因为它不会被遍历出来:

  Object.keys(enhancePerson) // [ 'name', 'province', 'city' ]
复制代码

这里还有一个我觉得比较容易忽略的点:

  person === enhancePerson // falseenhancePerson.city = '苏州市'enhancePerson.city === person.city // true
复制代码

显然这两个并不是同一个对象,但是我通过改变enhancePerson的city属性却影响到了person的city属性,这就是我们通常会忽略掉的,如果你不设置Proxy的set方法,它会保持默认行为:

  set (target, propKey, value) {target[propKey] = value}
复制代码

可能有些同学会想不就是不让它遍历出来吗?看这招:

  const person = {name: 'xiaoyun',province: '江苏省',city: '南京市',get address () {return `${this.province}-${this.city}`}}const enhancePerson = new Proxy(person, {ownKeys (target) {return Object.keys(target).filter(item => item !== 'address')}})enhancePerson.address // 江苏省-南京市Object.keys(enhancePerson) // [ 'name', 'province', 'city' ]
复制代码

虽然是实现了上述的功能,但是Proxy中的ownKeys拦截的方法太多,所以我们拦截ownKeys之后,会导致某些方法无法使用,并且拦截ownKeys返回的结果也有严格的要求:

  • 返回的结果必须是一个数组
  • 并且数组的元素必须是String或者Symbol类型
  • 结果必须包含对象的所有不可配置、自身拥有的属性
  • 如果对象不能扩展,则结果只能包含自身拥有的属性,不能含有其他属性

所以在拦截方法注意点很多,不然很容易出现问题。

Tip: 未通过defineProperty定义的属性的描述器属性默认为true,否则默认为false。

二、扩展基本操作

当我第一次接触Python时,比较有印象的就是它的List的一个语法: arr[1:3],以前只有羡慕的份,现在完全可以自己撸一个:

  const arr = [1, 2, 3, 4, 5, 6, 7, 8]const list = new Proxy(arr, {get (target, name) {if (name.includes(':')) {const indexs = name.split(':')return target.slice(indexs[0], indexs[1])}return target[name]}})list['2:6'] // [ 3, 4, 5, 6 ]
复制代码

是不是?,对于对象,我们同样可以采用类似的方法:

  const obj = {a: {b: {c: 'xiaoyun'}}}const obj1 = new Proxy(obj, {get (target, name) {const keys = name.split('.')return keys.reduce((pre, next) => {if (pre !== null && pre !== undefined) {pre = pre[next]}return pre}, target)}})obj1['a.b.c'] // xiaoyun
复制代码

喜欢本文的小伙伴们,欢迎关注我的订阅号超爱敲代码,查看更多内容.

快来围观一下JavaScript的Proxy相关推荐

  1. 柬埔寨招聘中文计算机,柬埔寨ll中文老师1000美金+招聘机会来啦,快来围观!!!...

    原标题:柬埔寨ll中文老师1000美金+招聘机会来啦,快来围观!!! 柬埔寨王国(the Kingdom of Cambodia) ,通称柬埔寨,旧称高棉,位于中南半岛,西部及西北部与泰国接壤,东北部 ...

  2. 2018麦考林杂志计算机科学,2018年加拿大大学麦考林杂志排名发布,快来围观你喜欢的学校排名有什么变动没?...

    原标题:2018年加拿大大学麦考林杂志排名发布,快来围观你喜欢的学校排名有什么变动没? 加拿大的教育质量是受到全世界广泛认可的,很多国家的学生会选择到加拿大留学. 前不久,麦考林杂志(Maclean' ...

  3. 【javaScript 的 proxy】

    JavaScript 的 proxy 什么是proxy 上代码 什么是proxy proxy大家可能不陌生,使用vue项目时也用过,也就是我们说的代理.怎样理解代理呢,通俗易懂些,来一段回忆,香港警匪 ...

  4. JavaScript 中Proxy(代理)和Reflect(反射)基础知识

    JavaScript 中Proxy(代理)和Reflect(反射)基础知识   最近在Vue3项目开发中,我们经常使用与Proxy和Reflect相关的函数.这些函数以各种形式出现在Vue3 Reac ...

  5. 双十二爬虫顶流崔庆才老师来图灵直播啦!快来围观啊!!!

    <Python 3网络爬虫开发实战(第2版)>上市一周便登上了京东新书销量榜第一位,延续第一版的好内容.好口碑,成为近期火爆技术圈的新书.12.12 晚 20:00 我们邀请崔庆才老师来图 ...

  6. 尼康d850相机参数测试软件,尼康 D850最全参数信息曝光 快来围观

    尼康 D850更多可靠参数信息.而这台新全幅的确在性能上相当惊艳,从参数上看,新相机将搭载一块具备4575万有效像素的无低通全画幅CMOS传感器,此外在安装手柄后,连拍速度也将达到9张/秒.从曝光的内 ...

  7. bash: 未预期的符号 `( 附近有语法错误_安规群中关于泄漏电流测试、接地符号等相关的6个问题,快来围观大神的回答吧!...

    [本文属"世界认证地图"原创,未经允许,请勿转载哦~~~] 问题一 群员提问:接地这样符合GB4706.1-2005的标准要求吗? 图片由群友提供 群友解答:接地符号标错地方,应该 ...

  8. Android Studio 3.6 发布啦,快来围观

    Android Studio 3.6 稳定版终于来了,此版本的 Android Studio 包括对一些设计工具的更新,包括布局编辑器和资源管理器. 该版本的更新需要 Plugin 对应更新支持,比如 ...

  9. 可怜的博主跟小豆人杠起来啦!Python制作的吃豆人小游戏,快来围观!!

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些P ...

最新文章

  1. 线上经验总结:一台 Java 服务器可以跑多少个线程?
  2. 阿云搭建php博客,阿云的应聘故事
  3. SAP Spartacus里的routerLink测试
  4. DVT和ADVT - 为数不多的DICOM测试工具说明AND下载
  5. java 省市区三级联动_AJAX省市区三级联动下拉菜单(java版)
  6. 分享到系统面板_win7电脑没有nvidia控制面板怎么办【解决方法】
  7. MFC制作打地鼠小游戏
  8. (81)Verilog HDL:状态机一段式
  9. java的核心类库_Java核心类库
  10. 一个可能是世界上最全的 API 接口集合库开源项目
  11. 多路复用之epoll模型
  12. 企业微信小程序 windows 使用 vconsole 调试
  13. 2022年计算机软件水平考试网络管理员(初级)练习题及答案
  14. html tooltips效果,CSS3+jQuery轻松实现工具提示(Tooltips)
  15. 服务器常用的操作系统有哪些
  16. 基于SVM的中文垃圾短信分类
  17. 美妆短视频的定位分享,教程、技巧都可做,还可尝试变装内容
  18. matlab验证叠加定理,叠加原理和戴维南定理实验报告
  19. 环境配置:前端程序员快速进行开发
  20. matlab安装及使用

热门文章

  1. Stackoverflow上人气最旺的十个Java问题
  2. hdu2203 KMP水的问题
  3. javascript包装对象
  4. cadence中元件所在库
  5. 安装SCOM Reporting Server
  6. ssh框架分页显示问题
  7. [计算机组成原理] Booth算法 —— 补码一位乘法
  8. NGINX前端代理TOMCAT取真实客户端IP
  9. 有关 iOS 的开发证书、应用标识、设备标识、配置文件以及密钥 #DF...
  10. iscsi介绍及iscsi target配置