hand
_1_11_286
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 21:19:28
在 JavaScript 中,Proxy
对象是一个强大的工具,它允许我们拦截并重新定义对象的基本操作。而 Proxy.revocable
则是 Proxy
的一个进阶特性,它为我们提供了撤销代理的能力。本文将深入探讨 Proxy.revocable
的使用,通过清晰的逻辑和实用的例子帮助大家掌握这一特性。
Proxy.revocable
是一个静态方法,它创建一个可撤销的 Proxy
实例。这个方法返回一个对象,该对象包含两个属性:
proxy
:这是一个 Proxy
实例,和直接使用 new Proxy()
创建的实例功能相同,可以用来拦截目标对象的操作。revoke
:这是一个函数,调用该函数可以撤销 proxy
的代理功能。一旦代理被撤销,再对 proxy
进行任何操作都会抛出 TypeError
异常。Proxy.revocable
的基本语法如下:
const { proxy, revoke } = Proxy.revocable(target, handler);
其中,target
是要代理的目标对象,handler
是一个包含拦截操作的对象。
在某些场景下,我们可能需要动态地控制代理的生命周期。例如,当用户注销登录时,我们可能希望撤销对某些敏感数据对象的代理,以确保数据的安全性。或者在资源管理方面,当不再需要代理时,撤销代理可以释放相关的资源。
// 目标对象
const target = {
message1: "hello",
message2: "everyone"
};
// 处理程序
const handler = {
get(target, prop) {
return `Intercepted: ${target[prop]}`;
}
};
// 创建可撤销的代理
const { proxy, revoke } = Proxy.revocable(target, handler);
// 使用代理
console.log(proxy.message1); // 输出: Intercepted: hello
// 撤销代理
revoke();
try {
// 尝试在代理撤销后访问属性
console.log(proxy.message1);
} catch (error) {
console.error(error); // 输出: TypeError: Cannot perform 'get' on a proxy that has been revoked
}
在这个例子中,我们首先创建了一个目标对象 target
和一个处理程序 handler
,然后使用 Proxy.revocable
创建了一个可撤销的代理 proxy
。在撤销代理之前,我们可以正常使用代理访问目标对象的属性。当调用 revoke()
函数撤销代理后,再尝试访问 proxy
的属性就会抛出 TypeError
异常。
// 模拟用户状态
let isUserLoggedIn = true;
// 目标对象:用户敏感数据
const userData = {
password: "secretpassword",
email: "user@example.com"
};
// 处理程序
const userDataHandler = {
get(target, prop) {
if (isUserLoggedIn) {
return target[prop];
} else {
throw new Error("User is not logged in");
}
}
};
// 创建可撤销的代理
const { proxy: userDataProxy, revoke: revokeUserDataProxy } = Proxy.revocable(userData, userDataHandler);
// 用户登录时访问数据
console.log(userDataProxy.email); // 输出: user@example.com
// 用户注销登录
isUserLoggedIn = false;
revokeUserDataProxy();
try {
// 尝试在用户注销且代理撤销后访问数据
console.log(userDataProxy.password);
} catch (error) {
console.error(error); // 输出: TypeError: Cannot perform 'get' on a proxy that has been revoked
}
在这个例子中,我们模拟了用户的登录状态。当用户登录时,我们可以通过代理访问用户的敏感数据。当用户注销登录时,我们不仅设置了 isUserLoggedIn
为 false
,还调用 revokeUserDataProxy()
函数撤销了代理,确保用户注销后无法再通过代理访问数据。
特性 | 描述 |
---|---|
Proxy.revocable |
创建一个可撤销的 Proxy 实例,返回包含 proxy 和 revoke 的对象 |
proxy |
可用于拦截目标对象操作的 Proxy 实例 |
revoke |
调用该函数可撤销 proxy 的代理功能,之后对 proxy 操作会抛出 TypeError 异常 |
Proxy.revocable
为我们提供了一种灵活的方式来控制代理的生命周期,在需要动态管理代理的场景中非常实用。通过合理使用这一特性,我们可以增强代码的安全性和资源管理能力。希望本文的介绍和例子能帮助你更好地理解和使用 Proxy.revocable
。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~