下面是 Proxy 支持的拦截操作一览。
对于可以设置、但没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果。
(1)get(target, propKey, receiver)
拦截对象属性的读取,比如proxy.foo和proxy['foo']。
最后一个参数receiver是一个对象,可选,参见下面Reflect.get的部分。
(2)set(target, propKey, value, receiver)
拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。
(3)has(target, propKey)
拦截propKey in proxy的操作,以及对象的hasOwnProperty方法,返回一个布尔值。
(4)deleteProperty(target, propKey)
拦截delete proxy[propKey]的操作,返回一个布尔值。
(5)ownKeys(target)
拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy),返回一个数组。该方法返回对象所有自身的属性,而Object.keys()仅返回对象可遍历的属性。
(6)getOwnPropertyDescriptor(target, propKey)
拦截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)。
(1)get(target, propKey, receiver)
(2)set(target, propKey, value, receiver)
var arr = {a:1,b:2,c:3};var obj = new Proxy(arr,{get (target,key,rec) {console.log('hhs')Reflect.get(target,key,rec);},set (target,key,value,rec) {console.log('xis')Reflect.set(target,key,value,rec);}})obj.test = 22VM1759:7 xis22obj.testVM1759:3 hhs
(12)apply(target, object, args)
var one = (args) => {return args.reduce((curr,val) => {curr += Number(val);return curr;},0);}var two = {apply(target,ctx,args){if (Array.isArray(args[0]) && args[0].every(it => typeof it == 'number')) {return target(args[0]);}console.log('args is not array')}}var pro = new Proxy(one,two);//pro([1,2,3,4,5])//15//pro()//VM2374:12 args is not array
3)has(target, propKey)
var info ={name:'zhangsan',age:11}var two = {has(target,key){console.log('kiss')return key in target;}}var pro = new Proxy(info,two)//'name' in pro//VM3078:3 kiss//true
(13)construct(target, args)
var one = function(){console.log('one')}var two = {construct(){return {name:"test"}}}var pro = {one,two}var pro = new Proxy(one,two)new pro()//{name: "test"}pro()// one
