ES6学习——元数据(meta)编程:代理(Proxies)API介绍

来源:互联网 发布:fpga与单片机速度 编辑:程序博客网 时间:2024/05/29 02:12

代理的概念大家应该很清楚了,设计模式中也有这个模式。ES6中关于代理的描述在26.2中,有兴趣的可以去看看。代理的API十分少,基本只有两个,一个是创建普通的代理,一个是创建可以收回的代理。

下面先看怎么创建普通的代理:

let target = {};let handler = {get(target, propKey, receiver) {console.log(`GET ${propKey}`);return 123;},has(target, propKey) {console.log(`HAS ${propKey}`);return true;}};let proxy = new Proxy(target, handler);
上面的handler里面定义了两个方法,一个是get,相当于在访问属性的时候会起到拦截作用,一个是has,在用in操作符检查属性是否存在的时候会起到拦截作用。具体handler里面可以定义哪些方法呢?在9.5章节中有详细的描述:

继续试验上面你的小例子:

proxy.foo//GET foo//123'hello' in proxy//HAS hello//trueproxy.bar = 'abc';target.bar//abc
从上面的结果中看到,get和has已经成功的进行了拦截。如果使用在handler上没有定义的方法,那么会执行默认的行为。


下面看看如何定义可以收回的代理:

let target = {}; let handler = {}; let {proxy, revoke} = Proxy.revocable(target, handler);proxy.foo = 123;console.log(proxy.foo); // 123revoke();console.log(proxy.foo); // TypeError: illegal operation attempted on a revoked proxy
一旦调用了revoke,将不允许在对proxy做任何操作,但是不影响继续使用target。


上面是针对每一个对象创建一个代理,这样用起来很麻烦,我们可以创建一个代理原型,然后从这个原型在创建对象,就自动完成了代理的过程:

let proto = new Proxy({}, {get(target, propertyKey, receiver) {console.log('GET '+propertyKey);return target[propertyKey];}});let obj = Object.create(proto);obj.bla;

*以上全部代码在Firefox 44下通过测试


0 0
原创粉丝点击