MoonCheung

MoonCheung

人生路漫漫,何曾有坦途。:)

理解 Proxy 如何使用

  • Proxy 用于修改某些操作的默认行为,在目标对象之前架设一层 “拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可对外界的访问进行过滤和改写。
    • get属性:该方法用于拦截某个属性的读取操作,可接受三个参数,依次为目标对象,属性名和proxy实例本身 (可选参数)
      • 如果访问目标对象不存在的属性,会抛出一个错误。如果没有对这个拦截函数,访问不存在的属性,只会返回undefined
    • set属性:该方法用于拦截某个属性的赋值操作,可接受 4 个参数,依次为目标对象,属性名,属性值和proxy实例本身 (可选参数)
    • apply属性,该方法可接受三个参数,依次为目标对象,目标对象的上下文对象 (this) 和目标对象的参数数组
    • has属性,该方法用来拦截 HasProperty 操作,即判断对象是否具有某个属性时,这个方法会生效,而且可接受两个参数,依次为目标对象,需查询的属性名
    • construct属性,该方法用于拦截new命令,可接受两个参数,依次为目标对象,构造函数的参数对象
    • deleteProperty属性,该方法用于拦截 delete 操作,如果这个方法抛出错误或者返回 false,当前属性就无法被 delete 命令删除
    • defineProperty属性,该方法拦截了 Object.defineProperty 操作
    • getOwnPropertyDescriptor属性,该方法拦截 Object.getOwnPropertyDescriptor (),返回一个属性描述对象或者 undefined
    • getPrototypeOf属性,该方法主要用来拦截获取对象原型,具体来说,拦截下面这些操作:
      • Object.prototype.__proto__
      • Object.prototype.isPrototypeOf()
      • Object.getPrototypeOf()
      • Reflect.getPrototypeOf()
      • instanceof()
    • isExtensible属性, 该方法拦截 Object.isExtensible 操作
    • ownKeys属性,该方法用来拦截对象自身属性的读取操作,具体来说,拦截下面这些操作:
      • Object.getOwnPropertyNames()
      • Object.getOwnPropertySymbols()
      • Object.keys()
      • for...in...循环
    • preventExtensions属性,该方法拦截 Object.preventExtensions (),该方法必须返回一个布尔值,否则会被自动转为布尔值
    • setPrototypeOf属性,该方法主要用来拦截 Object.setPrototypeOf 方法
    • Proxy.revocable属性,该方法返回一个可取消的 Proxy 实例
// get,set方法
let proxy = new Proxy({ },{
  get: function(target, prop){
    console.log('设置 get 操作');
    return target[prop];
  },
  set: function(target, prop, value){
    console.log('设置 set 操作');
    target[prop] = value;
  }
})

proxy.time = 35;  // 设置 set 操作 35
console.log(proxy.time);  // 设置 get 操作 35

// has 方法 隐藏某些属性,不被in运算符发现
let handler = {
  has: function(target, key){
    if(key[0] === '_'){
      return false;
    }
    return key in target;
  }
}

let target = {
  _prop: 'foo',
  prop: 'foo'
}

let proxy = new Proxy(target, handler);
console.log('__prop' in proxy) //打印: false;
console.log('prop' in proxy) //打印: true;
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。