Почему вы хотите отменить прокси? Не могли бы вы предоставить практическое применение Proxy.revocable()
?
На основе MDN Proxy.revocable () документации Я понимаю, что это позволяет собирать мусор. Однако не разрешит ли сбор мусора, если вы только что удалили объект Proxy?
Приложение: Если с этим вопросом что-то не так, пожалуйста, дайте мне знать, что это такое, и я с удовольствием перефразирую его или добавлю дополнительная информация.
@ Эми:
Мне показалось, что это ненужная встроенная функция, поскольку я мог создать отзывной прокси-сервер, например:
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)
Однако, похоже, что сборка мусора действительно является проблемой, так как я могу отозвать доступ из объекта, но не могу удалить внутреннюю ссылку на него внутри объекта Proxy. Если только ...
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)
Итак, создав двухуровневый прокси, вы можете создать сборщик мусора и отзывный прокси. Итак, почему это встроено? Простота использования? Или я что-то упустил? Это не полностью сборщик мусора, хотя все еще есть тонкая оболочка со ссылкой на объект с нулевым прототипом.