hand
_1_11_287
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:54
在 JavaScript 中,Proxy(代理)是一个强大的特性,它允许我们拦截并重新定义对象的基本操作,如属性访问、赋值、枚举等。而与之相关的 Reflect 对象则提供了与 Proxy 拦截操作相对应的方法。同时,Proxy.revocable()
方法为我们提供了撤销代理的能力,这在一些动态控制代理的场景中非常有用。本文将深入探讨代理撤销以及它在动态控制代理场景中的应用。
代理是 ES6 引入的一个新特性,它可以创建一个对象的代理,从而可以拦截并重新定义该对象的基本操作。以下是一个简单的代理示例:
const target = {
name: 'John',
age: 30
};
const handler = {
get(target, property) {
console.log(`Getting property ${property}`);
return target[property];
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.name);
在这个例子中,我们创建了一个 target
对象和一个 handler
对象,handler
对象中的 get
方法会拦截对 proxy
对象属性的访问操作。
Proxy.revocable()
方法用于创建一个可撤销的代理对象。它返回一个包含 proxy
和 revoke
两个属性的对象,调用 revoke()
方法可以撤销代理。示例如下:
const target = {
message1: 'hello',
message2: 'everyone'
};
const handler = {};
const { proxy, revoke } = Proxy.revocable(target, handler);
console.log(proxy.message1);
revoke();
try {
console.log(proxy.message1);
} catch (error) {
console.error('代理已撤销,无法访问属性:', error);
}
在这个例子中,调用 revoke()
方法后,再访问代理对象的属性会抛出错误。
在一些应用中,我们可能需要根据用户的权限动态控制对对象的访问。例如,当用户的权限过期时,撤销对某些敏感对象的代理访问。
const sensitiveData = {
password: '123456',
creditCard: '1234-5678-9012-3456'
};
const handler = {
get(target, property) {
console.log(`Trying to access property ${property}`);
return target[property];
}
};
const { proxy, revoke } = Proxy.revocable(sensitiveData, handler);
// 模拟用户权限过期
function expireUserPermission() {
revoke();
console.log('用户权限已过期,代理已撤销');
}
console.log(proxy.password);
expireUserPermission();
try {
console.log(proxy.creditCard);
} catch (error) {
console.error('无法访问,代理已撤销:', error);
}
在这个例子中,当调用 expireUserPermission()
函数时,代理被撤销,之后再访问代理对象的属性会抛出错误,从而实现了权限管理的动态控制。
在某些情况下,我们可能需要在特定条件下释放代理所关联的资源。例如,当某个对象不再使用时,撤销对它的代理以释放相关资源。
const resourceObject = {
data: 'Some large data',
close() {
console.log('资源已释放');
}
};
const handler = {
get(target, property) {
if (property === 'close') {
return () => {
target.close();
revoke();
};
}
return target[property];
}
};
const { proxy, revoke } = Proxy.revocable(resourceObject, handler);
console.log(proxy.data);
proxy.close();
try {
console.log(proxy.data);
} catch (error) {
console.error('无法访问,代理已撤销:', error);
}
在这个例子中,当调用 proxy.close()
方法时,资源被释放,同时代理被撤销。
应用场景 | 描述 | 示例代码 |
---|---|---|
权限管理 | 根据用户权限动态控制对对象的访问,权限过期时撤销代理 | 见权限管理部分代码 |
资源释放 | 在特定条件下释放代理所关联的资源,释放资源时撤销代理 | 见资源释放部分代码 |
代理撤销是 JavaScript 中一个非常实用的特性,它为我们提供了动态控制代理的能力。通过合理运用代理撤销,我们可以实现诸如权限管理、资源释放等复杂的功能,从而使我们的代码更加灵活和安全。在实际开发中,我们可以根据具体的业务需求,灵活运用代理撤销来解决各种动态控制代理的场景。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~