Proxy介绍

152 阅读2分钟
1. 代理的作用
  • 通过使用代理工具(如 Fiddler 或 Charles),抓取http/https协议请求,手动修改请求参数和响应结果。
  • 在处理线上时,可以把压缩混淆过的JS映射成本地未压缩混淆过的JS文件
2.Proxy对象

const p = new Proxy(target,handler)
target:要使用Proxy包装的目标对象
handler:一个以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作代理p的行为

 示例:
 const a = {name:'hoho'};
 const proxy = new Proxy(a,{
 //定义了一个get捕获器,用于捕获属性读取的操作。作用是用于拦截用户对目标对象的相关操作,在这些操作传播到目标对象之前,会先调用对应的捕获器函数,从而拦截并修改相应的行为
     get(target,property,receiver){
         console.log('property',property)
         return target[property]
     }
 })
 
 console.log(a.name)
 console.log(a.age)
 

handler对象支持的捕获器

  • handler.get() 属性读取操作
  • handler.set()属性设置操作
  • handler.deleteProperty() delete操作符
  • handler.ownKeys(): Object.getOwnPropertyNames方法和Object.getOwnPropertySymbols方法
  • handler.has(): in操作符
3. Reflect方法

介绍:一个内置的对象,提供拦截JavaScript操作的方法

Reflect支持的静态方法

-   Reflect.get(target, propertyKey[, receiver]):获取对象身上某个属性的值,类似于 target[name]。
-   Reflect.set(target, propertyKey, value[, receiver]):将值赋值给属性的函数。返回一个布尔值,如果更新成功,则返回 true。
-   Reflect.deleteProperty(target, propertyKey):删除 target 对象的指定属性,相当于执行 delete target[name]。
-   Reflect.has(target, propertyKey):判断一个对象是否存在某个属性,和 in 运算符的功能完全相同。
-   Reflect.ownKeys(target):返回一个包含所有自身属性(不包含继承属性)的数组。

    const obj = {a:1,b:2};
    console.log(Reflect.set(obj,'c',3))//true
    console.log(Reflect.has(obj,'a')) //true
    console.log(Reflect.has(obj,'d')//false
    console.log(Reflect.ownKeys(obj))//['a','b','c']
4.Proxy使用场景
  • 增强型数组
function enhancedArray(arr) {
  return new Proxy(arr, {
    get(target, property, receiver) {
      const range = getRange(property);
      const indices = range ? range : getIndices(property);
      const values = indices.map(function (index) {
        const key = index < 0 ? String(target.length + index) : index;
        return Reflect.get(target, key, receiver);
      });
      return values.length === 1 ? values[0] : values;
    },
  });

  function getRange(str) {
    var [start, end] = str.split(":").map(Number);
    if (typeof end === "undefined") return false;

    let range = [];
    for (let i = start; i < end; i++) {
      range = range.concat(i);
    }
    return range;
  }

  function getIndices(str) {
    return str.split(",").map(Number);
  }
}

使用:
const arr = enhancedArray([12345]);

console.log(arr[-1]); //=> 5
console.log(arr[[2, 4]]); //=> [ 3, 5 ]
console.log(arr[[2, -2, 1]]); //=> [ 3, 4, 2 ]
console.log(arr["2:4"]); //=> [ 3, 4]
console.log(arr["-2:3"]); //=> [ 4, 5, 1, 2, 3 ]

文章来源:mp.weixin.qq.com/s/UCgFeW9jH…