JavaScript 代理Proxy

本文介绍了ES6中的代理和反射机制,如何通过它们在读取和设置对象属性时添加额外行为,如Vue3.x中的响应式设计。重点讲解了空代理和get(),set()捕获器的使用,以及如何利用ReflectAPI传递操作到目标对象。
摘要由CSDN通过智能技术生成

ES6标准新增的代理与反射为开发者提供了拦截并向基本操作嵌入额外行为的能力。比如我们在读取或设置一个Object的属性的值的时候,有时候需要加入额外操作,以提供响应式的能力。大受欢迎的Vue3.x就大量运用了这种特性,成为最受欢迎的响应式框架。

代理

代理就是目标对象的抽象,它拦截了外界对目标对象的直接访问,从而有效的保护了目标对象。拦截操作全部都定义在捕获器对象中。

虽然ES5时代的Object.defineProperty()方法也能实现类似的目标,但是它对于目标对象是破坏性的操作,而我们今天要说的代理是一种非破坏性的操作。

创建空代理

空代理就是什么操作也不拦截,这个时候的代理对象只是起到一个“传话筒”的作用。从代码表现来看,此时捕获器是一个空对象。

const target = {a:1, b:2}
const handler = {}    // 拦截操作是空的
const proxy = new Proxy(target,handler)
proxy.a // => 1  // 如实返回
proxy.b  // =>2

get()捕获器、set()捕获器和反射API

实际上,使用代理最常见的就是在捕获器之中添加get()和set()方法。get()方法接收三个参数,分别是:目标对象,正在读取的目标对象的属性,代理对象。set()方法接收四个参数,分别是:目标对象,正在设置的目标对象的属性,设置的新值,代理对象。

同时,利用Reflect对象的API,可以快速将对代理的操作传递到目标对象上。

const obj = {a:1, b:2}
const handler = {
    get(target,property,receiver){
        console.log(`你正在读取${property}属性`)
    },
    set(target,property,value,receiver){
        console.log(`你将${property}属性的值改成了${value}`)
        Reflect.set(...arguments)      // 将修改操作传递到目标对象上
    },
}
const proxy = new Proxy(obj,handler)
console.log(proxy.a)  // =>'你正在读取a属性'
proxy.b = 3    // => '你将b属性的值改成了3'
console.log(obj.b)  //=>3,目标对象的属性值也跟着改了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值