ES6学习之路(六) Proxy 代理器&Reflect
来源:互联网 发布:ubuntu 设置ntp客户端 编辑:程序博客网 时间:2024/06/05 00:15
Proxy 代理器
用户必须通过它来操作原对象;
var proxy = new Proxy(target,handler); //target参数表示所要拦截的目标对象, //handler参数也是一个对象,用来定制拦截行为。 var p1 = new Proxy({},{ get:function(target,property){ return 35; } }); console.log(p1.time);//35 console.log(p1.name);//35 console.log(p1.title);//35 //上面由于Proxy接收的目标对象是空,第二个参数设置配置对象进行拦截, //get方法的两个参数分别是目标对象和想要访问的属性,因为Proxy拦截,所以访问到的任何属性都是35; // 要使用Proxy起作用,就必须操作Proxy的实例,而不是针对目标对象进行操作;
//如果 handler没有进行任何设置,那就等同于直接通向源对象; var target = {}; var handler = {}; var proxy = new Proxy(target,handler); proxy.a = 'b'; console.log(target.a);//'b'; //Proxy的实例也可以作为其它对象的原型, var proxy = new Proxy({},{ get : function (target,property) { return 35; } }); let obj = Object.create(proxy); console.log(obj.time);//35
////proxy 同一个拦截函数,可拦截多个操作设置var handler = { get:function(target,name){ if(name === 'prototype'){ return Object.prototype; } return 'Hello' + name; }, apply:function(target,thisBinding,args){ return args[0]; }, construct:function(target,args){ return {value:args[1]}; } }; var fproxy = new Proxy(function(x,y){return x+y},handler); console.log(fproxy(1,2));//1 console.log(new fproxy(1,2));//{value: 2} console.log(fproxy.prototype === Object.prototype)//true console.log(fproxy.foo)//Hellofoo ////对于可以设置、但没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果。
注意
虽然 Proxy 可以代理针对目标对象的访问,但它不是目标对象的透明代理,即不做任何拦截的情况下,也无法保证与目标对象的行为一致。主要原因就是在 Proxy 代理的情况下,目标对象内部的this关键字会指向 Proxy 代理。
Proxy 的方法很多,具体可以参考ES6入门点击查看
Reflect
Reflect 对象的目的
1.将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。
2.修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。
3.让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。
4.Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。
Reflect主要是继承了一些的Object的静态方法,使用起来更友好,更方便,
下面是它的方法
Reflect.apply(target,thisArg,args)
Reflect.construct(target,args)
Reflect.get(target,name,receiver)
Reflect.set(target,name,value,receiver)
Reflect.defineProperty(target,name,desc)
Reflect.deleteProperty(target,name)
Reflect.has(target,name)
Reflect.ownKeys(target)
Reflect.isExtensible(target)
Reflect.preventExtensions(target)
Reflect.getOwnPropertyDescriptor(target, name)
Reflect.getPrototypeOf(target)
Reflect.setPrototypeOf(target, prototype)
具体链接请点击ES6入门
- ES6学习之路(六) Proxy 代理器&Reflect
- 学习笔记:ES6之Proxy和Reflect
- ES6学习7(Proxy&Reflect)
- ES6学习9章:Proxy和Reflect
- ES6--Proxy和Reflect
- ES6 Proxy/Reflect 浅析
- ES6 -- Proxy搭档:Reflect
- ES6总结--Proxy、Reflect
- ES6——Proxy(代理)、Reflect(反射)
- 学习记录ES6反射内置对象Proxy与Reflect
- ES6 Proxy 和 Reflect 用法
- 【转】-ES6 Proxy和reflect
- 初步探究ES6之Proxy代理
- 初步探究ES6之Proxy代理
- 【ES6学习】— (4)ES6新增API Symbol、Proxy、Reflect简记
- JAVA动态代理之java.lang.reflect.Proxy.newProxyInstance源码
- ES6 -- 最佳代理:Proxy
- ES6学习之路(六) Set&WeakSet
- C++设计模式二--OberverPattern(观察者模式)
- 向量的表示、投影、变换、协方差矩阵及PCA
- (二)hadoop配置虚拟机环境
- AndroidM及以上,接听电话之后5S 灭屏
- CRC校验
- ES6学习之路(六) Proxy 代理器&Reflect
- 带你玩转“数据卫士”Data Guard
- 服务器负载过高问题分析
- marker下报错Type Dynamic Web Module 3.1 requires Java 1.7 or newer.
- 用链表实现部分图书信息管理功能
- BlcoklyGame分析二
- ural1009 数位dp
- 【Java】Callable接口与Runnable接口的区别
- 首次开通