proxy的妙用

110 阅读1分钟

属性代理

  • 1,封装链式调用,并且避免出现多余的方法或属性
function proxyObject(row) {
  const { id, name, address } = row;
  const handler = {
    get(target, prop, receiver) {
      if (prop === 'del') {
        return function(propName) {
          delete target[propName];
          return receiver;
        };
      }
      if (prop === 'delAll') {
        return function(propNames) {
          propNames.forEach(propName => delete target[propName]);
          return receiver;
        };
      }
      if (prop === 'replaceProperty') {
        return function (oldName, newName) {
          if (Reflect.has(target, oldName)) {
            const descriptor = Reflect.getOwnPropertyDescriptor(target, oldName);
            Reflect.defineProperty(target, newName, descriptor);
            Reflect.deleteProperty(target, oldName);
            return receiver;
          }
          return receiver;
        }
      }
      return target[prop];
    },
  };
  const obj = new Proxy({ id, name, address }, handler);
  return obj;
}
// test
const row = { id: 1, name: 'John', address: '123 Main St' };
const obj = proxyObject(row);
console.log(obj.del('address'));
console.log(obj.delAll(['name','address']));
console.log(obj.replaceProperty('address','email'));

数据验证

  • 1,set 和 get 方法,来检测对象属性值的合法性。