Skip to content

Proxy与Reflect

Proxy

  • Proxy 用于修改某些操作的默认行为,可以用来拦截某个对象的属性访问方法,然后重载对象的 “ . ” 运算符。

  • Proxy 可以理解成在目标对象前架设一个“拦截”层,外界对该对象的访问都必须先通过这层拦截,因此提供了一种机制可以对外界的访问进行过滤和改写。

js
let object = new Proxy(
    {},
    {
        get: function (target, key, receiver) {
            console.log(`getting ${key}`);
            return Reflect.get(target, key, receiver);
        },
        set: function (target, key, value, receiver) {
            console.log(`setting ${key}`);
            return Reflect.set(target, key, value, receiver);
        },
    }
);
object.a = 100; //setting a
console.log(object.a); // getting a  100
  • 对比 Object.defineProperty 方法:
js
let object = {};
let value;

Object.defineProperty(object, 'a', {
    get: function () {
        console.log('getting a');
        return value;
    },
    set: function (newValue) {
        value = newValue;
        console.log('setting: ' + newValue);
    },
    enumerable: true,
    configurable: true,
});
object.a = 100; //setting 100
console.log(object.a); // getting a  100

Reflect

  • 第一,将 Object 对象的一些明显属于语言内部的方法(如 Object.defineProperty)放到 Reflect 对象上,现阶段,某些方法同时在 Object 和 Reflect 对象上部署,未来新的方法只在 Reflect 对象上部署。也就是说,从 Reflect 对象上可以获得语言内部的方法。

  • 第二,修改某些 Object 方法的返回结果,让其变得更加合理。

  • 第三,让 Object 操作都编程函数行为,某些 Object 操作是命令式,比如 name in obj 和 delete obj [name],而 Reflect.has(obj, name) 和 Reflect.deleteProperty(obj, name) 让它们变成了函数行为。

  • 第四,Reflect 对象的方法与 Proxy 对象的方法一一对应,只要是 Proxy 对象的方法,就能在 Reflect 对象上找到对应的方法,这就是 Proxy 对象可以方便的调用对应的 Reflect 方法来完成默认行为,作为修改行为的基础。也就是说,无论 Proxy 怎么修改默认行为,我们总可以在 Reflect 上获取到默认行为。

Released under the MIT License.