proxy(代理)用法

1、什么是Proxy?

Proxy 也就是代理,可以帮助我们完成很多事情,例如对数据的处理,对构造函数的处理,对数据的验证,说白了,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

语法
let p = new Proxy(target, handler);
参数
  • target :需要使用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
  • handler: 一个对象,其属性是当执行一个操作时定义代理的行为的函数
  • proxy:是一个被代理后的新对象,它拥有target的一切属性和方法.只不过其行为和结果是在handler中自定义的

示例,一个简单的代理:

let test = {
    name: "小明"
  };
  test = new Proxy(test, {
    get(target, key) {
      console.log('获取了getter属性');
      return target[key];
    }
  });
  console.log(test.name);

在这里插入图片描述
上方的案例,我们首先创建了一个test对象,里面有name属性,然后我们使用Proxy将其包装起来,再返回给test,此时的test已经成为了一个Proxy实例,我们对其的操作,都会被Proxy拦截。当我们对test对象查询时,就会进入我们写好的get函数,其他操作都是如此
使用set来拦截一些操作,并将get返回值更改

let xiaohong = {
    name: "小红",
    age: 15
  };
  xiaohong = new Proxy(xiaohong, {
    get(target, key) {
      let result = target[key];
      //如果是获取 年龄 属性,则添加 岁字
      if (key === "age") result += "岁";
      return result;
    },
    set(target, key, value) {
      if (key === "age" && isNaN(value)) {
        throw Error("age字段必须为Number类型");
      }
      return Reflect.set(target, key, value);
    }
  });
  console.log(`我叫${xiaohong.name}  我今年${xiaohong.age}了`);
  xiaohong.age = "aa";

在这里插入图片描述
get 拦截函数中添加了一个判断,如果是取 age 属性的值,则在后面添加 岁。在 set 拦截函数中判断了如果是更改 age 属性时,类型不是 Number则抛出错误。

扩展 使用代理实现双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>
        <span>年龄:</span>
        <input type="text" id="age" value="13">
    </p>
</body>
<script>
    const spanAge = document.getElementById("age");
    let user = {
        age:spanAge.value
    }
    let newuser = new Proxy(user,{
        set(target, key, value){
            if (key === "age" && isNaN(value)) {
                throw Error("age字段必须为Number类型");
            }
            spanAge.value = value;
            return Reflect.set(target, key, value);
        }
    })
    spanAge.onblur = function(){
        newuser.age = document.getElementById("age").value;
            console.log(user);
        }
        console.log(user)
</script>
</html>

在这里插入图片描述

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中引入了Proxy作为响应式系统的核心,它可以用于代理对象并拦截其属性的访问。通过使用Proxy,我们可以更加灵活地对数据进行监听和响应。 在Vue 3中,使用Proxy代理的步骤如下: 1. 创建一个普通的JavaScript对象作为数据源。 2. 使用`new Proxy(target, handler)`创建一个代理对象,其中`target`是要代理的对象,`handler`是一个包含拦截器方法的对象。 3. 在`handler`对象中定义拦截器方法,例如`get`、`set`、`deleteProperty`等。这些方法会在对代理对象进行相应操作时被调用。 4. 将代理对象作为Vue实例的数据源。 下面是一个简单的示例代码,演示了如何使用Proxy代理对象: ```javascript // 创建一个普通的JavaScript对象作为数据源 const data = { name: 'John', age: 25 }; // 使用Proxy创建代理对象 const proxy = new Proxy(data, { get(target, key) { console.log(`访问了属性 ${key}`); return target[key]; }, set(target, key, value) { console.log(`设置了属性 ${key} 的值为 ${value}`); target[key] = value; } }); // 将代理对象作为Vue实例的数据源 const app = Vue.createApp({ data() { return { person: proxy }; } }); // 在Vue模板中使用代理对象的属性 app.mount('#app'); ``` 在上述示例中,我们创建了一个普通的JavaScript对象`data`作为数据源,并使用Proxy创建了代理对象`proxy`。在代理对象的`get`和`set`方法中,我们分别打印了访问和设置属性的信息,并对原始对象进行了相应的操作。最后,将代理对象作为Vue实例的数据源,并在Vue模板中使用了代理对象的属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值