为什么要撤销代理?你能提供一个
根据MDN Proxy.revocable()文档,我了解到它允许垃圾回收。但是,如果您只删除代理对象,它是否也会允许垃圾回收呢?
补充:如果这个问题有什么问题,请告诉我是什么,我很乐意重新表述或添加其他信息。
@Amy:
我认为这似乎是一个不必要的内置功能,因为我可以像下面这样创建一个可撤销的代理:
Proxy.revocable()
的实际应用吗?根据MDN Proxy.revocable()文档,我了解到它允许垃圾回收。但是,如果您只删除代理对象,它是否也会允许垃圾回收呢?
补充:如果这个问题有什么问题,请告诉我是什么,我很乐意重新表述或添加其他信息。
@Amy:
我认为这似乎是一个不必要的内置功能,因为我可以像下面这样创建一个可撤销的代理:
function createRevocable(o,handlers){
var revoked = false
var handlerWrapper = {
get(...args){
if(revoked){
throw Error('Sorry, this object went poof.')
}
if(typeof handlers.get == 'function'){
return handlers.get(...args)
}else{
return Reflect.get(...args)
}
}
}
var p = new Proxy(o,Object.assign({},handlers,handlerWrapper))
var r = function(){
revoked = true
}
return {r,p}
}
var a = createRevocable({a:1},{})
var prox = a.p
var revoke = a.r
console.log(prox.a) //1
revoke()
console.log(prox.a)
然而,看起来垃圾回收确实是问题所在,因为我可以从对象中撤销访问权限,但无法删除代理对象内部对其的内部引用。除非...
function createRevocable(o,handlers){
var revoked = false
var proxyProxyHandlers = {
get(target,prop,rec){
if(revoked){
throw Error('Sorry, this object went poof.')
}
return p[prop]
}
,//etc...
}
var p = new Proxy(o,handlers)
var proxyProxy = new Proxy(Object.create(null),proxyProxyHandlers)
var r = function(){
// Delete the one and only reference to the proxy:
delete p
revoked = true
}
return {r,p:proxyProxy}
}
var a = createRevocable({a:1},{})
var prox = a.p
var revoke = a.r
console.log(prox.a) //1
revoke()
console.log(prox.a)
因此,通过创建一个两层代理,您可以创建一个可垃圾回收且可撤销的代理。那么,为什么要构建它?便于使用吗?还是我漏掉了什么?虽然它并非完全可垃圾回收,但仍有一个薄包装器与具有空原型的对象的引用。