ES6之Reflect和Proxy
Reflect
js 为了减少黑魔法,保证代码可以完全使用。使用了尽量减少内部的语法,转而采取了函数式编程的思想,将一些语法转化为了 API 的形式。这些 API 都放到了一个对象里面,这个对象就叫做 Reflect 。它类似于其他语言中的反射。它是可以访问底层的功能,例如函数的调用,内存的读取,赋值,属性的一些判断操作。下面是它提供的一些 API :
const obj = {}
// obj.a = 1;
Reflect.set(obj, "a", 1);
console.log(obj)
console.log(obj.a)
console.log(Reflect.get(obj, "a"))
function test(a,b){
console.log(a,b)
}
test(1,2)
Reflect.apply(test, null, [1,2])
delete obj.a;
Reflect.deleteProperty(obj, "a");
function Test(a, b) {
this.a = a;
this.b = b;
}
// const t = new Test(1, 3);
const t = Reflect.construct(Test, [1, 3]);
console.log(t)
console.log("a" in obj);
console.log(Reflect.has(obj, "a"));
注意:在使用 Reflect.defineProperty 时如果出现配置问题,不会报错而是返回 false 。
Proxy
const obj = {
a: 1,
b: 2
}
const proxy = new Proxy(obj, {
get(target, key, receiver) {
console.log(target, key, receiver)
return Reflect.get(target, key, receiver)
},
set(target, key, value, receiver) {
console.log(target, key, value, receiver)
return Reflect.set(target, key, value, receiver)
},
has(target, key, receiver) {
console.log(target, key, receiver)
return Reflect.has(target, key, receiver)
},
})
proxy.a = 1;
console.log(proxy.a)
代理是在目标对象外面套了一层,外界只和代理接触,代理和目标对象进行内部操作。由于代理需要操作目标对象,所以代理可以修改底层功能。可以 new 一个 Proxy 来创建一个代理。第一个参数是目标对象,第二个参数是配置对象,类似于 Reflect 里面的 API ,我们可以进行实现一些功能,然后使用反射应用。这些参数都会在使用的时候传入。