在 JS 里面, proxy set 拦截器, 有那些参数, 分别表示什么含义【热度: 120】

关键词:proxy set 拦截器

  1. target参数
    • 含义:它是被代理的目标对象。这个对象是原始的、即将被操作(在set操作的情境下是被设置属性值)的对象。例如,如果你创建了一个代理来拦截对某个对象属性的设置操作,target就是那个实际拥有属性的原始对象。
    • 示例
      let targetObj = { name: "John" };
      let proxyObj = new Proxy(targetObj, {
        set(target, property, value) {
          // 这里的target就是targetObj
          console.log(`正在设置${target}对象的${property}属性为${value}`);
          target[property] = value;
          return true;
        },
      });
      proxyObj.age = 30;
      在这个例子中,targetproxyObj.age = 30这个操作中,就是targetObj,它是被代理的基础对象,set拦截器可以对这个对象的属性设置操作进行监控和修改。
  2. property参数
    • 含义:它表示要设置的属性名。在对象操作中,当你通过obj[key] = value或者obj.property = value这样的方式设置属性时,property就是那个key或者property。这个参数让拦截器知道具体是哪个属性正在被操作。
    • 示例
      let targetObj = { name: "John" };
      let proxyObj = new Proxy(targetObj, {
        set(target, property, value) {
          if (property === "age" && typeof value !== "number") {
            throw new Error("年龄必须是数字");
          }
          target[property] = value;
          return true;
        },
      });
      proxyObj.age = "abc";
      在这里,当尝试设置proxyObj.age时,property的值就是'age',拦截器可以根据这个属性名来进行特定的验证(如这里检查年龄是否为数字)。
  3. value参数
    • 含义:它是要设置给属性的新值。在obj[key]=value或者obj.property = value这样的操作中,value就是等号右边的值。拦截器可以获取这个值来决定是否允许设置,或者对这个值进行转换等操作。
    • 示例
      let targetObj = { name: "John" };
      let proxyObj = new Proxy(targetObj, {
        set(target, property, value) {
          if (typeof value === "string") {
            value = value.toUpperCase();
          }
          target[property] = value;
          return true;
        },
      });
      proxyObj.name = "jane";
      console.log(targetObj.name);
      在这个例子中,当设置proxyObj.name时,value最初是'jane',拦截器将其转换为大写'JANE'后再设置到targetObjname属性中,最后targetObj.name的值为'JANE'
  4. receiver参数(可选)
    • 含义:它通常是操作发生的对象。在大多数简单的情况下,它和proxy对象本身(即被用来设置属性的代理对象)是相同的。不过,在一些复杂的继承或者代理链场景下,它可以帮助确定真正接收操作的对象。这个参数提供了一种机制来正确地处理属性访问的上下文。
    • 示例
      let targetObj = { name: "John" };
      let handler = {
        set(target, property, value, receiver) {
          console.log(`接收者是${receiver}`);
          target[property] = value;
          return true;
        },
      };
      let proxyObj = new Proxy(targetObj, handler);
      let anotherObj = Object.create(proxyObj);
      anotherObj.age = 30;
      在这个例子中,当通过anotherObj(它继承自proxyObj)来设置属性age时,receiver参数将指向anotherObj,这可以帮助拦截器更好地理解操作的上下文。