JS Proxy 介绍与示例
Description
Proxy对象允许您创建一个可以代替原始对象的对象,但它可以重新定义基本的对象操作,如获取、设置和定义属性。
创建一个Proxy
对象需要两个参数:
target
: 您想代理的原始对象Handler
: 一个对象,它定义了哪些操作将被拦截,以及如何重新定义被拦截的操作。
example
下面这个例子中,我们创建了一个代理对象proxy1
,同时我们传入了两个参数,由于第二个参数是空对象,所以这个代理对象和之前的对象没有什么区别
const target = {
message1: "hello",
message2: "everyone"
};
const handler1 = {};
const proxy1 = new Proxy(target, handler1);
console.log(proxy1.message1); // hello
console.log(proxy1.message2); // everyone
// 修改proxy对象也会影响原来的对象
console.log(proxy1.message1) // world
console.log(target.message1) // world
我们传一个有意义的handler
试一试:
const target = {
message1: "hello",
message2: "everyone"
};
const handler2 = {
get(target, prop, receiver) {
return "world";
}
};
const proxy2 = new Proxy(target, handler2);
console.log(proxy2.message1); // world
console.log(proxy2.message2); // world
console.log(target.message1); // hello
console.log(target.message2); // everyone
上面这个例子中,我们的handler
重定义了get
方法,从而达到拦截原始的get
方法的目的。如果这个时候我们访问代理对象的两个属性,都会返回world
,访问原对象则不受影响。
那get
方法是什么?
简单的讲,就是获取对象属性的一个方法
把参数打印出来看一眼
target: {"message1":"hello","message2":"everyone"}
prop: message1
world: 会无限递归
那第一和第二个参数就很清楚了,第一个参数是被代理的对象,第二个参数被代理对象的属性(也就是请求这个属性本来应该返回这个东西的)
但是如果打印第三个参数就会无限递归。我们还是去看看mdn吧!
非常好!看完还是没懂!
看一看例子,非常好!也没有使用这个参数的例子,好,那我也不钻这个牛角尖了。
不过打印会递归调用,说明打印这个属性会继续调用get
方法,那么我猜测可能receiver
就是我们创建出来的这个代理对象!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)