网站首页 > 技术文章 正文
概念
ES6增加的特性中,其中包含代理(Proxy)与反射(Reflection)。
代理Proxy是一种可以拦截及改变JS引擎操作的包装器,相当于改变成JS语言的对象中的默认行为,使得开发人员能够实现对JS更底层的操作。
反射Reflect是一种与Object类似的实现,只不过它包含的是语言内部的方法,旧方法(如defineProperty)会在Object/Reflect同存在,语言性的新方法只会存在于Reflect。
Proxy拦截默认行为方法的方法,我们称之为代理陷阱,每个代理陷阱都会有一个与之对应的Reflect方法,Proxy与Reflect虽然是互相独立的,配合起来却是所向披靡。
Proxy与Reflect的对应表
为了更好理解,我们先引入一个最简单的例子,实现当试图从一个对象取它不存在的属性,抛出错误:
target, key, receiver 三者为代理陷阱的参数,分别表示被代理的目标对象,键,代理对象。虽然obj与pObj一样的,但我们只对pObj进行修改,从而更改obj。
代理中的get与Reflect.get()有着对应关系,举一反三,我们例出13个陷阱与Reflect方法:
根据各个代理陷阱的作用,可以做不同的事情,这里就不一一列举定义的例子了,而是举例一些更业务型的例子。
给数组增加查询方法
比如有一个数组,元素都是对象,需要使用getItemById,getItemByName,getItemByAge……等等任意getItemByXx的方法查询出数据。
监听多重等号执行过程
我们知道 a = b = x的过程是从右到左 b = x, a = x,却难以用代码来证明这个过程(比如从表面上看,也可能是 b = x, a = b),而Proxy提供了这种可能
pObj.a.m = pObj.a = {name: ‘b’}; 先取出pObj.a 再设置,而pObj.a.m未修改pObj的直接属性,不会触发。最终obj打印的结果,可以看出,pObj.a.m拿的是pObj.b。
换种写法
说明过程是b = x;a =x;而不是b = x; a = b;
代理Proxy实现节流/防抖
因为调用函数时,会触发apply代理陷阱,我们可以在里面阻止事件执行,使得delay满足,这与传统的节流/防抖实现差不多是一个意思,Proxy并没有更高明,只不过是换一种方式。
Proxy与Reflect的实例数不胜数,点到为止了,以后看到有趣的实例再补充。
参考资料:
《深入理解ES6》
《ECMAScript 6入门》
猜你喜欢
- 2024-10-18 前端反向代理(前端反向代理怎么配置)
- 2024-10-18 JavaScript 九种跨域方式实现原理
- 2024-10-18 Proxy 来代理 JavaScript 里的类(js中proxy)
- 2024-10-18 octokit.js:2023每个前端都值得学习的通用SDK!
- 2024-10-18 一面 2:JS-Web-API 知识点与高频考题解析
- 2024-10-18 使用reveal.js制作精美的网页版PPT
- 2024-10-18 es6中的代理-Proxy(es proxy)
- 2024-10-18 事件——《JS高级程序设计》(javascript高级程序设计 javascript权威指南)
- 2024-10-18 「JavaScript 从入门到精通」18.WebApi介绍
- 2024-10-18 day7:前端面试题(js)(前端面试题2021及答案js)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)