ES6 Proxy 和 Reflect
(一)Reflect
Reflect是什么?
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers的方法相同。Reflect
不是一个函数对象,因此它是不可构造的。
与大多数全局对象不同,Reflect
不是一个构造函数。你不能将其与一个new运算符一起使用,或者将Reflect
对象作为一个函数来调用。Reflect
的所有属性和方法都是静态的(就像Math
对象)。
为什么要使用Reflect?
- 更加有用的返回值:
- 函数操作
- 更加可靠的函数式执行方式
- 可变参数形式的构造函数
- 控制访问器或者读取器的this
- 避免直接访问
__proto__
详细见:
(二)Proxy
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。
语法:
let p = new Proxy(target, handler);
参数:
-
target
用
Proxy
包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。 -
handler
一个对象,其属性是当执行一个操作时定义代理的行为的函数。
方法:
Proxy.revocable()
:创建一个可撤销的Proxy
对象。允许的属性一共 13 种,与 Reflect
的方法名一致
handler对象的方法: