2013-05-03 9 views
18

私はで実行しました。これは、クロスブラウザWeakMapES5に実装しています。 (WeakMapはES6の予定です)EcmaScript5でWeakMapを実装していますか?

これはJavaScript言語自体でサポートされていない可能性がありますか?

編集:ただ、明確にするために、私は弱い地図ではなく、通常のマップを参照しています。私はこのプロジェクトをChromeのプロファイラを使用してテストしましたが、キーは強力な参照によって保持されていません。彼らはWeakMapからそれらを削除することなくGC'ed取得します。

+3

ソースコードの検討を検討してください。 –

+3

@squintそれはかなり深いことをしています - 私はキーに強い参照を保持していない方法を把握することはできません。たとえば、配列を使用していません。 – paleozogt

+3

WeakMapsは、オブジェクトにデータを関連付けることができますが、WeakMapインスタンス自体がガベージコレクションされたときにオブジェクトがガベージコレクションされるようにするES6機能です。言語サポートなしでこれらの両方を行うことは不可能です。ほとんどのWeakMapシムは、WeakMapインスタンス自体がGCされたときにデータをGCさせるという部分については無視します。 – AgentME

答えて

26

コードを書くにはしばらく時間がかかりましたが、それは私にヒットしました。キー自体が値への参照を格納するために使用されます。 setに例えば

、いくつかの層はdefPropObject.definePropertyであると定義されている

defProp(obj, globalID, { value: store }); 

objを行いglobalIDがGUIDとstore値を含むストレージオブジェクトである、キーです。それはこれが非常に巧妙である

obj[globalID];

で値を検索しますgetでダウンその後

。 WeakMapは実際には(weakまたはそれ以外の)何かへの参照を含んでおらず、値を秘密に保管する場所のポリシーを設定するだけです。 Object.definePropertyを使用すると、誤って値の格納場所を検出することはありません。つまり、魔法のGUIDを調べてそれを調べる必要があります。

キーは値を直接参照するので(WeakMapはそれを参照しません)、キーへのすべての参照がなくなると、通常のようにGCされます。

+0

'obj'がWeakMapキーで' globalID'が 'obj'で定義されている場合、' Object.getOwnPropertyNames() 'を使うときに' globalID'がなぜ表示されないのでしょうか? –

+2

私は同じことが不思議でした。あまりにも悪いのは、それほど遠いです。それは事実上判読できないほど後ろにあります。より簡単な説明が必要です... – dandavis

+0

解説:libチート:Object.getOwnPropertyNames()を再定義します。既存のネイティブ関数を実行するための – dandavis

関連する問題