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上げたいぞ!