Proxy 对象可以对一个对象进行代理,可以拦截对象和重新定义拦截的对象,Proxy 返回一个新的代理对象。

参数

一个 Proxy 创建伴随着两个参数:

  • target: 要代理的原始对象
  • handler: 对原始对象进行拦截或者拦截后重新定义的对象

const proxy = new Proxy(target, handler);

简单实例

const handler = {
  get: function (target, prop) {
    return prop in target ? target[prop] : 37;
  },
};

const target = {
  a: 1,
  b: undefined,
};
const p = new Proxy(target, handler);

console.log(p.a, p.b, p.c); // 1, undefined, 37
console.log(target); // { a: 1, b: undefined }

trap 列表

来自官方的一个 trap 列表实例:

var docCookies = new Proxy(docCookies, {
  get: function (oTarget, sKey) {
    return oTarget[sKey] || oTarget.getItem(sKey) || undefined;
  },
  set: function (oTarget, sKey, vValue) {
    if (sKey in oTarget) {
      return false;
    }
    return oTarget.setItem(sKey, vValue);
  },
  deleteProperty: function (oTarget, sKey) {
    if (!sKey in oTarget) {
      return false;
    }
    return oTarget.removeItem(sKey);
  },
  enumerate: function (oTarget, sKey) {
    return oTarget.keys();
  },
  ownKeys: function (oTarget, sKey) {
    return oTarget.keys();
  },
  has: function (oTarget, sKey) {
    return sKey in oTarget || oTarget.hasItem(sKey);
  },
  defineProperty: function (oTarget, sKey, oDesc) {
    if (oDesc && 'value' in oDesc) {
      oTarget.setItem(sKey, oDesc.value);
    }
    return oTarget;
  },
  getOwnPropertyDescriptor: function (oTarget, sKey) {
    var vValue = oTarget.getItem(sKey);
    return vValue
      ? {
          value: vValue,
          writable: true,
          enumerable: true,
          configurable: false,
        }
      : undefined;
  },
});

参考链接