可撤销代理是proxy的高级特性,通过proxy.revocable()创建含proxy和revoke的对象,调用revoke后proxy永久失效并抛typeerror,适用于调试拦截、沙箱控制、权限管理及资源清理等场景。

可撤销代理是 Proxy 的一个高级特性,它让你能在运行时主动关闭代理对象,使其后续所有操作都抛出错误。这在需要临时拦截、调试、权限控制或资源清理的场景中非常有用。
创建可撤销代理
使用 Proxy.revocable() 方法创建,它返回一个包含 proxy 和 revoke 函数的对象:
- proxy:实际使用的代理对象,行为由 handler 控制
- revoke:一个无参函数,调用后该 proxy 立即失效
示例:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
get(target, prop) { return target[prop] * 2; }
});
console.log(proxy.x); // 2
revoke();
console.log(proxy.x); // TypeError: Cannot perform 'get' on a proxy that has been revoked
典型使用场景
可撤销代理适合那些生命周期明确、需主动终止拦截的场景:
- 临时调试拦截:比如只在开发阶段监听对象访问,上线前或某个条件满足后撤回
- 沙箱环境控制:限制第三方脚本对全局对象的访问,执行完立即 revoke 防止后续篡改
- 权限时效管理:用户临时获得某对象的读写权限,过期或登出时调用 revoke
- 内存与副作用清理:避免 handler 中的闭包或事件监听长期持有引用,revoke 后 GC 更容易回收
注意事项和常见陷阱
一旦 revoke 被调用,proxy 就永久失效,无法恢复,也无法再次调用 revoke(多次调用无副作用但不推荐):
- revoke 函数本身没有参数,也不返回值
- revoke 后对 proxy 的任何操作(包括 typeof、in、==、JSON.stringify)都会抛出 TypeError
- 不能对同一个 proxy 多次调用 Proxy.revocable() 创建新 revoke;必须保留原始返回的 revoke 引用
- 如果 handler 中有异步逻辑(如 setTimeout),需确保 revoke 不在异步回调执行前被调用,否则可能报错
配合 WeakMap 实现自动清理
若需多个可撤销代理并统一管理,可用 WeakMap 存储 revoke 函数,配合对象销毁时机自动调用:
const revokes = new WeakMap();function createSafeProxy(obj, handler) {
const { proxy, revoke } = Proxy.revocable(obj, handler);
revokes.set(proxy, revoke);
return proxy;
}
// 使用后手动清理
const p = createSafeProxy({ a: 1 }, { get: () => 'safe' });
revokes.get(p)?.(); // 安全调用 revoke
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










