Proxy和Reflect的使用

在ES6中新增了Proxy这个类及Reflect这个对象

Proxy用来代理对象监视对象的作用

Reflect上有操作对象的一些方法 这些方法对应了Proxy上捕获器的方法

Proxy: 监视代理对象

const obj = {
    name: '小明',
    age: 18
}

在js中如果要监听一个对象的一些响应式就可以用到Proxy Vue3响应式原理就是使用的Proxy

Proxy 是一个类 创建时需要传入俩个参数 :
1为需要监听的对象 2为捕获器方法对象 有13个捕获器方法 在此列举四个捕获器方法,其他捕获器方法关于原型的,感兴趣的可以查下其他资料 常用的就为下面四个

// 创建一个对象
const obj = {
    name: '小明',
    age: 18
};
// new一个Proxy 用来监视obj对象
const proxy = new Proxy(obj, {
    // 这些捕获器方法会在对所监视的对象进行相对操作时 被回调

    // 一:获取对象属性时的捕获器方法:
    // 参数说明:1为所监视的对象,2为操作时对象的key,3为new出的代理对象
    get(e,k,r) {
        console.log(e,`对象被获取了${k}的值为:${e[k]}`);
        // return e[k];
        // 利用Reflect
        Reflect.get(e,k,r); 
    },

    // 二:设置或修改对象属性时的捕获器方法:
    // 参数说明:1为所监视的对象,2为操作时对象的key,3为设置或修改时的值,4为new出的代理对象
    set(e,k,n,r) {
        console.log(e,`对象被设置了${k}的值为:${n}`);
        // e[k] = n;
        // 利用Reflect
        Reflect.set(e,k,n,r); 
    },

    // 三:查询对象属性时的捕获器方法
    // 参数说明:1为所监视的对象,2为操作时对象的key
    has(e,k) {
        console.log(e,`对象被查看是否当前有${k}这个属性`);
        // 返回布尔类型 true/false
    },

    // 四:删除对象属性时的捕获器方法
    // 参数说明:1为所监视的对象,2为操作时对象的key
    deleteProperty(e,k) {
        console.log(e,`对象被删除了${k}这个属性`);
        // delete e[k];
        // 利用Reflect
        Reflect.deleteProperty(e,k);
    },
});

// 操作:

console.log(proxy.name);   // 此时会回调触发proxy里get捕获器方法
proxy.age = 22;            // 此时会回调触发proxy里set捕获器方法
console.log('girlFriend' in proxy); // 返回布尔类型 true/false 可做条件编译来使用 
if('girlFriend' in proxy); // 此时会回调触发proxy里has捕获器方法
delete proxy.age;          // 此时会回调触发proxy里delterProperty捕获器方法 

对于捕获器get和set方法最后一个参数:new出来的代理对象的解释:

Reflect有一个construct方法,当使用构造函数时 new出来的对象类型想要指向另一个构造函数时就可以用到construct这个方法

function Man(name,age) {
    this.name = name;
    this.age = age;
}

function Woman() {
    
}

const c = new Man('c',30)
console.log(c)
// 此时c的类型为Man 想要指向Woman 就可以用到Reflect上的construct方法

// construct方法会返回一个新的对象 
// 参数说明:1参为new时的构造函数名,2参为new时需要传入的属性值,3为需要类型指向的构造函数名
const ck = Reflect.construct(Man,['c',30],Woman)

console.log(ck) 
// 此时ck的类型就为Woman类型 
console.log(ck.__proto__ === Woman.prototype) 
// 验证下: 此时ck的隐式原型和Woman的原型属性是绝等的 也就是说隐式原型指向的是Woman的原型属性

在ES6类中 ES6类的代码转ES5构造函数的源码 实现继承时就使用了Reflect上的construct方法来实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于"vue3proxy结合reflect"的问题,我理解你可能想了解如何在Vue 3中使用Proxy与Reflect结合起来。Vue 3是一个流行的JavaScript框架,而Proxy和Reflect则是ES6中新增的特性。 在Vue 3中,可以使用Proxy对象来代理Vue实例,以便捕获对数据的访问和修改。Proxy对象可以拦截并处理对Vue实例的操作,比如读取、设置和删除属性等。而Reflect对象提供了一组用于操作对象的方法,比如Reflect.get()、Reflect.set()和Reflect.deleteProperty()等。 结合使用Proxy和Reflect可以提供更灵活的控制和监控能力。你可以通过在Vue实例上创建一个代理对象,来拦截对数据的访问和修改,并在代理处理器中使用Reflect方法来操作实际的数据。这样可以轻松地实现对数据的拦截、校验、代理等功能。 下面是一个简单的示例代码,展示了如何在Vue 3中使用Proxy和Reflect结合起来: ```javascript const data = { message: 'Hello, Vue!', }; const proxy = new Proxy(data, { get(target, key) { console.log('Getting ' + key); return Reflect.get(target, key); }, set(target, key, value) { console.log('Setting ' + key + ' to ' + value); return Reflect.set(target, key, value); }, }); // 创建Vue应用 const app = Vue.createApp({ data() { return proxy; // 使用代理对象 }, }); app.mount('#app'); ``` 在上面的代码中,我们创建了一个名为data的普通对象,并使用Proxy对象创建了一个代理对象proxy。在代理对象的get和set处理器中,我们分别使用Reflect.get和Reflect.set来操作实际的数据。这样,当我们通过Vue实例访问或修改数据时,会触发代理处理器,并通过Reflect方法操作实际的数据。 希望这个例子能帮助到你,如果还有其他问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值