WeakMap使いたい!
id:mooz さんが WeakMap のスライドを作っているのでWeakMapについてはそちらを。または、より激しいのはLet's WeakMap - 枕を欹てて聴くをw
Panoという拡張機能で、Firefoxのタブをグループ毎にツリー表示しているが、タブとグループのインターフェースとして、タブならtab要素、グループならgroupのオブジェクトをラップするクラス(もどき)を作って使用している。
var itemProto = { // ... }; function TabItem (aTab) { this.tab = aTab; } TabItem.prototype = { __proto__: itemProto, // ... } function GroupItem (aGroup) { this.group = aGroup; } GroupItem.prototype = { __proto__: itemProto, get children () { var tabs = []; for (let [, tabItem] in Iterator(this.group._children)) { tabs.push(new TabItem(tabItem.tab)); } return tabs; } }
んで、現在の使用方法だと、GroupItemインスタンスのchildrenにアクセスすると既存でインスタンスがあっても新たに new してしまう。これは勿体無い。
const itemCache = new WeakMap(); function TabItem (aTab) { if (itemCache.has(aTab)) return itemCache.get(aTab); this.tab = aTab; itemCache.set(aTab, this); } TabItem.prototype = { // ... }
としてしまえば、効率的なキャッシュとして使用できそうだ。というか、これがまさにWeakMapの使い道なのではないかと思い始めた。
現状、Panoでは Firefox4からサポートしているが、Firefox6からにしてしまえば気兼ねなく使える。minVersion上げたいぞ!