《深入理解ES6》阅读笔记 --- 代理和反射 API

《深入理解ES6》阅读笔记 --- 代理和反射 API

这两个API在实际的业务场景中几乎非常少的使用,至于具体的场景可能还需要大家来挖掘了。看起来每一个API都有一些其他的API可模拟,可使用,它们具体的内涵就是在于拦截,执行,返回结果。

Proxy(代理)

从字面上来看,这应该很好理解,就像nginx一样,将请求代理。我们来看一个非常小的例子:

let handler = {
    get: function(target, name){
        return name in target ? target[name] : 37;
    }
};

let p = new Proxy({}, handler);

p.a = 1;
p.b = undefined;

console.log(p.a, p.b); 
// 1, undefined

console.log('c' in p, p.c); 

通过 new Proxy来创建一个自定义的行为,handler做为捕获器可以捕获对象操作的行为。这一点上,其实和Object.defineProperty来创建一个get,set方法非常像。由于b已经存在,所以返回的是undefined,当我们打印c时,p.c就会返回37。

有兴趣的话,可以仔细阅读:Proxy

Reflect

Reflect(反射)其实也和Proxy的作用非常类似,它提供的是拦截操作JavaScript的方法,唯一和代理不同的是,Reflect提供的是静态方法,无法使用new运算符。

获取一个属性

let obj = {a:1}

console.log(Reflect.get(obj,'a'))

设置一个属性

let obj = {};
Reflect.set(obj, "prop", "value"); // true
obj.prop; // "value"

对函数进行调用:

Reflect.apply(Math.floor, undefined, [1.75]); 

这和函数的apply唯一不同的是第一个参数必须是要调用的函数,后两个参数与函数的apply保持一致。

更多的方法,有兴趣的话可以阅读:Reflect

说实话,这两个API的应用场景,其实我也有些糊涂,可能要经常使用,比对,才能发现比之对应有相同功能的方法的区别。

编辑于 2018-08-12

文章被以下专栏收录