一篇文章搞懂JavaScript中的代理和代理的使用
程序员文章站
2022-03-12 23:19:12
目录proxy的基本知识proxy可以实现的什么是代理mdn上的定义:proxy(也就是代理) 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。官方的定义总是这么晦涩枯燥,那么...
什么是代理
mdn上的定义:proxy(也就是代理) 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。
官方的定义总是这么晦涩枯燥,那么究竟proxy能做什么?
1.代理这个概念来自于元编程,就是一种你可以编写出一个可以读取、修改、分析、甚至生成新程序的程序。而js可以通过proxy和reflect这两个对象来进行js元编程!!
2.proxy就是代理,当我们不方便去访问某个对象或者不满足于简单的访问时,代理就可以作为“中间人”来帮助我们更好的来控制对象的操作!!
proxy的基本知识
语法:
const handler = {}; let target = {};//目标对象 let userproxy = new proxy(target,handler);//成功实现代理!! userproxy.a = 1; console.log(target.a);//1 console.log(target == userproxy);//false
target: 要使用 proxy 包装的目标对象
handler: 一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理的行为。
ok!那么恭喜你,你已经掌握了proxy的定义。
在使用中,需要我们去更多费神的是handler中代理行为的代码,它可以帮助我们来更好的使用proxy
handler对象方法
const handler = { get(target,prop,receiver){ console.log('get!'); return 'a'; } } let target = {name:'tar'}; let userproxy = new proxy(target,handler); userproxy.name
当然还有其他更多的方法请参考mdn:handler 对象的方法
proxy可以实现的
跟踪属性访问
当我们需要知道对象什么时候被访问、修改时。
let target = { name:'ww' } const handlers = { get(tar, prop){ console.log('get'); return reflect.get(...arguments); }, set(tar,prop){ console.log('set'); return reflect.set(...arguments); } } let userproxy = new proxy(target, handlers); userproxy.name; userproxy.name = 'wqw';
解决对象属性为undefined的问题
let target = {} let handlers = { get: (target, property) => { target[property] = (property in target) ? target[property] : {} if (typeof target[property] === 'object') { return new proxy(target[property], handlers) } return target[property] } } let proxy = new proxy(target, handlers) console.log('z' in proxy.x.y) // false (其实这一步已经针对`target`创建了一个x.y的属性) proxy.x.y.z = 'hello' console.log('z' in proxy.x.y) // true console.log(target.x.y.z) // hello
我们代理了get,并在里边进行逻辑处理,如果我们要进行get的值来自一个不存在的key,则我们会在target中创建对应个这个key,然后返回一个针对这个key的代理对象。
这样就能够保证我们的取值操作一定不会抛出can not get xxx from undefined
但是这会有一个小缺点,就是如果你确实要判断这个key是否存在只能够通过in操作符来判断,而不能够直接通过get来判断。
参考资料:
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!
推荐阅读
-
一篇文章带你了解JavaScript中的变量,作用域和内存问题
-
一篇文章搞懂JavaScript中的代理和代理的使用
-
Linux Shell中curl和wget使用代理IP的方法教程
-
Linux Shell中curl和wget使用代理IP的方法教程
-
前端JavaScript中的反射和代理
-
一篇文章带你了解JavaScript中的变量,作用域和内存问题
-
Linux Shell中的curl和wget如何使用代理IP的方法教程
-
Linux Shell中的curl和wget如何使用代理IP的方法教程
-
Linux Shell中curl和wget使用代理IP的方法教程
-
一篇文章搞懂JavaScript中的代理和代理的使用