下面是 Proxy 支持的拦截操作一览。
    对于可以设置、但没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果。
    (1)get(target, propKey, receiver)
    拦截对象属性的读取,比如proxy.fooproxy['foo']
    最后一个参数receiver是一个对象,可选,参见下面Reflect.get的部分。
    (2)set(target, propKey, value, receiver)
    拦截对象属性的设置,比如proxy.foo = vproxy['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)

    1. var arr = {a:1,b:2,c:3};
    2. var obj = new Proxy(arr,{
    3. get (target,key,rec) {
    4. console.log('hhs')
    5. Reflect.get(target,key,rec);
    6. },
    7. set (target,key,value,rec) {
    8. console.log('xis')
    9. Reflect.set(target,key,value,rec);
    10. }
    11. })
    12. //print
    13. obj.test = 22
    14. VM1759:7 xis
    15. 22
    16. obj.test
    17. VM1759:3 hhs

    (12)apply(target, object, args)

    1. var one = (args) => {
    2. return args.reduce((curr,val) => {
    3. curr += Number(val);
    4. return curr;
    5. },0);
    6. }
    7. var two = {
    8. apply(target,ctx,args){
    9. if (Array.isArray(args[0]) && args[0].every(it => typeof it == 'number')) {
    10. return target(args[0]);
    11. }
    12. console.log('args is not array')
    13. }
    14. }
    15. var pro = new Proxy(one,two);
    16. //pro([1,2,3,4,5])
    17. //15
    18. //pro()
    19. //VM2374:12 args is not array

    3)has(target, propKey)

    1. var info ={name:'zhangsan',age:11}
    2. var two = {
    3. has(target,key){
    4. console.log('kiss')
    5. return key in target;
    6. }
    7. }
    8. var pro = new Proxy(info,two)
    9. //'name' in pro
    10. //VM3078:3 kiss
    11. //true

    (13)construct(target, args)

    1. var one = function(){console.log('one')}
    2. var two = {
    3. construct(){
    4. return {name:"test"}
    5. }
    6. }
    7. var pro = {
    8. one,
    9. two
    10. }
    11. var pro = new Proxy(one,two)
    12. new pro()
    13. //{name: "test"}
    14. pro()
    15. // one