ES6中新增了Proxy对象,从字面上看可以理解为代理器,主要用于改变对象的默认访问行为,实际表现是在访问对象之前增加一层拦截,任何对对象的访问行为都会通过这层拦截。在拦截中,我们可以增加自定义的行为。
Proxy实际是一个构造函数,接收两个参数,一个是目标对象target;另一个是配置对象handler,用来定义拦截的行为。
通过Proxy构造函数可以生成实例proxy,任何对proxy实例的属性的访问都会自动转发至target对象上,我们可以针对访问的行为配置自定义的handler对象,因此外界通过proxy访问target对象的属性时,都会执行handler对象自定义的拦截操作
控制台输出
注意
1)必须通过代理实例访问
控制台输出没有拦截到数据
2)配置对象不能为空对象
这样相当于直接访问原对象
1-----------------get(target, propKey, receiver)。
拦截对象属性的读取操作,
2-----------------set(target, propKey, value, receiver)
拦截对象属性的设置操作,
3----------------------has(target, propKey)。
拦截hasProperty的操作,返回一个布尔值,
4--------------------------deleteProperty(target, propKey)。
拦截delete proxy[propKey]的操作,返回一个布尔值,表示是否执行成功,
5----------------------------------ownKeys(target)。
拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for...in循环等操作。
6------------------------getOwnPropertyDescriptor(targetpropKey)。
拦截Object.getOwnPropertyDescriptor(proxy, propKey)操作,返回属性的属性描述符构成的对象。
7-------------------------------defineProperty(target, propKey, propDesc)。
拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy,propDescs)操作,返回一个布尔值。
8-----------------------------------------preventExtensions(target)。
拦截Object.preventExtensions(proxy)操作,返回一个布尔值。
9-------------------------------getPrototypeOf(target)。
拦截Object.getPrototypeOf(proxy)操作,返回一个对象。
10--------------------------------------isExtensible(target)。
拦截Object.isExtensible(proxy),返回一个布尔值,表示对象是否是可扩展的。
11-------------------------------setPrototypeOf(target, proto)。
拦截Object.setPrototypeOf(proxy, proto)操作,返回一个布尔值,表示的是拦截设置对象的原型属性的行为。
12-------------------------------apply(target, object, args)。
拦截Proxy实例作为函数调用的操作,例如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。
13-----------------------------------construct(target, args)。
拦截Proxy实例作为构造函数调用的操作,例如new proxy(...args)。
!!!这些函数都有一个通用的特性,即如果在target中使用了this关键字,再通过Proxy处理后,this关键字指向的是Proxy的实例,而不是目标对象target