Proxy和Reflect
Proxy
用于改变某些操作的默认行为,在语言层面做出的修改,属于”元编程”。对变成语言进行编程。
var proxy = new Proxy(
{},
{
get: function(target, property) {},
set: function(target, key, value) {}
}
);
Proxy 作为构造函数,接受两个参数,第一个是要代理的目标对象,第二个是一个配置对象。注意如果要使得 Proxy 起作用,必须针对 Proxy 对象进行操作。如果配置对象没有设置任何拦截,那就等同于直接通向原对象。
拦截的操作
- get:拦截对象属性的获取
- set:拦截对象属性的设置
- has:拦截 propKey in proxy 的操作,返回一个布尔值
- deleteProperty:拦截 delete 操作
- ownKeys:拦截返回所有的可遍历的属性数组的操作
- getOwnPropertyDescriptor:返回属性的描述对象
- defineProperty:就是拦截 defineProperty
- apply
- …
也就是基本都是可以拦截的了
收回代理
Proxy.revocable 其实就是返回一个可以被取消的 Proxy 实例。
let { proxy, revoke } = Proxy.revocable({}, {});
revoke();
就是在目标不允许直接访问的时候,可以通过代理访问,一旦访问结束,就可以收回代理权,不允许再次访问。
this 问题
Proxy 不是目标对象的透明代理,因为在设置了 Proxy 代理的情况下,目标对象的 this 关键字会被指向 Proxy 代理。这个的问题很大啊。
用处
就是拦截目标对象的任意属性,可以来做很多的事情,访问某个属性的时候可以拦截下来,做其他的事情。
Reflect
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com
文章标题:Proxy和Reflect
文章字数:401
本文作者:泽鹿
发布时间:2019-08-28, 16:45:23
最后更新:2019-08-28, 20:06:17
原始链接:http://panyifei.github.io/2019/08/28/前端技术/js/框架以及规范/ECMAScript6/Proxy和Reflect/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。