4

なぜプロキシを取り消す必要があるのですか? の実用的なアプリケーションを提供していただけます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)

そのため、2 層のプロキシを作成することで、ガベージ コレクションと取り消しが可能なプロキシを作成できます。では、なぜ組み込まれているのでしょうか。使いやすさ?または、何か不足していますか?ただし、完全にガベージ コレクションが可能なわけではありません。null プロトタイプを持つオブジェクトへの参照を含むシン ラッパーがまだ存在します。

4

1 に答える 1