代理可捕获13种不同的基本操作。
    这些操作有各自不同的反射API方法、参数、关联ECMAScript操作和不变式。
    正如前面示例所展示的,有几种不同的JavaScript操作会调用同一个捕获器处理程序。
    不过,对于在代理对象上执行的任何一种操作,只会有一个捕获处理程序被调用。不会存在重复捕获的情况。
    只要在代理上调用,所有捕获器都会拦截它们对应的反射API操作。
    9.2.1 get()
    get()捕获器会在获取属性值的操作中被调用。对应的反射API方法为Reflect.get()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. get(target, property, receiver) {
    4. console.log('get()');
    5. return Reflect.get(...arguments);
    6. }
    7. });
    8. proxy.foo;
    9. // get()

    9.2.2 set()
    set()捕获器会在设置属性值的操作中被调用。对应的反射API方法为Reflect.set()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. set(target, property, value, receiver) {
    4. console.log('set()');
    5. return Reflect.set(...arguments);
    6. }
    7. });
    8. proxy.foo = 'bar';
    9. // get()

    9.2.3 has()
    has()捕获器会在in操作符中被调用。对应的反射API方法为Reflect.has()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. has(target, property) {
    4. console.log('has()');
    5. return Reflect.has(...arguments);
    6. }
    7. });
    8. 'foo' in proxy;
    9. // has()

    9.2.4 defineProperty()
    defineProperty()捕获器会在Object.defineProperty()中被调用。对应的反射API方法为Reflect.defineProperty()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. defineProperty(target, property,descriptor) {
    4. console.log('defineProperty()');
    5. return Reflect.defineProperty(...arguments);
    6. }
    7. });
    8. Object.defineProperty(proxy, 'foo', {vakue: 'bar'});
    9. // defineProperty

    9.2.5 getOwnPropertyDescriptor()
    getOwnPropertyDescriptor()捕获器会在Object.getOwnPropertyDescriptor()中被调用。对应的反射API方法为Reflect.getOwnPropertyDescriptor()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. getOwnPropertyDescriptor(target, property) {
    4. console.log('getOwnPropertyDescriptor()');
    5. return Reflect.getOwnPropertyDescriptor(...arguments);
    6. }
    7. });
    8. Object.getOwnPropertyDescriptor(proxy, 'foo');
    9. // defineProperty

    9.2.6 deleteProperty()
    deleteProperty()捕获器会在delete操作符中被调用。对应的反射API方法为Reflect.deleteProperty()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. deleteProperty(target, property) {
    4. console.log('deleteProperty()');
    5. return Reflect.deleteProperty(...arguments);
    6. }
    7. });
    8. delete poperty.foo
    9. // deleteProperty

    9.2.7 ownKeys()
    ownKeys()捕获器会在Object.keys()及类似方法中被调用。对应的反射API方法为Reflect.ownKeys()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. ownKeys(target) {
    4. console.log('ownKeys()');
    5. return Reflect.ownKeys(...arguments);
    6. }
    7. });
    8. Object.keys(proxy);
    9. // ownKeys()

    9.2.8 getPrototypeOf()
    getPrototypeOf()捕获器会在Object.getPrototypeOf()中被调用。对应的反射API方法为Reflect.getPrototypeOf()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. getPrototypeOf(target) {
    4. console.log('getPrototypeOf()');
    5. return Reflect.getPrototypeOf(...arguments);
    6. }
    7. });
    8. Object.getPrototypeOf(proxy);
    9. // getPrototypeOf()

    9.2.9 setPrototypeOf()
    setPrototypeOf()捕获器会在Object.setPrototypeOf()中被调用。对应的反射API方法为Reflect.setPrototypeOf()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. setPrototypeOf(target, prototype) {
    4. console.log('setPrototypeOf()');
    5. return Reflect.setPrototypeOf(...arguments);
    6. }
    7. });
    8. Object.setPrototypeOf(proxy, Object);
    9. // setPrototypeOf()

    9.2.10 isExtensible()
    isExtensible()捕获器会在Object.isExtensible()中被调用。对应的反射API方法为Reflect.isExtensible()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. isExtensible(target) {
    4. console.log('isExtensible()');
    5. return Reflect.isExtensible(...arguments);
    6. }
    7. });
    8. Object.isExtensible(proxy);
    9. // isExtensible()

    9.2.11 preventExtensions()
    preventExtensions()捕获器会在Object.preventExtensions()中被调用。对应的反射API方法为Reflect.preventExtensions()。

    1. const myTarget = {};
    2. const proxy = new Proxy(myTarget, {
    3. preventExtensions(target) {
    4. console.log('preventExtensions()');
    5. return Reflect.preventExtensions(...arguments);
    6. }
    7. });
    8. Object.preventExtensions(proxy);
    9. // preventExtensions()

    9.2.12 apply()
    apply()捕获器会在调用函数时中被调用。对应的反射API方法为Reflect.apply()。

    1. const myTarget = () => {};
    2. const proxy = new Proxy(myTarget, {
    3. apply(target, thisArg, ...argumentsList) {
    4. console.log('apply()');
    5. return Reflect.apply(...arguments);
    6. }
    7. });
    8. proxy();
    9. // apply()

    9.2.13 construct()
    construct()捕获器会在new操作符中被调用。对应的反射API方法为Reflect.construct()。

    1. const myTarget = function() {};
    2. const proxy = new Proxy(myTarget, {
    3. construct(target, argumentsList, newTarget) {
    4. console.log('construct()');
    5. return Reflect.construct(...arguments)
    6. }
    7. });
    8. new proxy;
    9. // construct()