Для чего нужен отзывной прокси в JavaScript? - PullRequest
0 голосов
/ 12 февраля 2020

Почему вы хотите отменить прокси? Не могли бы вы предоставить практическое применение 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)

Итак, создав двухуровневый прокси, вы можете создать сборщик мусора и отзывный прокси. Итак, почему это встроено? Простота использования? Или я что-то упустил? Это не полностью сборщик мусора, хотя все еще есть тонкая оболочка со ссылкой на объект с нулевым прототипом.

...