狠狠撸

狠狠撸Share a Scribd company logo
ES.next

WeakMap
id:mooz / @stillpedant
id:mooz / @stillpedant
          http://mooz.github.com/index-ja.html
宣伝
本が出ます
ES.next WeakMap
WeakMap
WeakMap = 連想配列
ECMAScript 6 に導入予定
Firefox 6 より利用可能
WeakMap 用法
1.   set(key, value)
     –   key を指定して value を設定
2.   get(key)
     –   key にひもづけられた value を取得
3.   has(key)
     –   key にひもづけられた値があるかチェック
4.   delete(key)
     –   key に対するエントリを削除




※ has, delete は Firefox 独自実装
いまさら连想配列……?
すでに {}?Object() があるけど?
{}?Object() と比較して


1. key にオブジェクトが指定可能
 –   しかも多くの実装では定数時間で値が取得できる
2. key に指定されたオブジェクトを「弱く」参照
 –   GC (Garbage Collector) は何からも参照されていない
     オブジェクトを削除対象とする
 –   WeakMap の key として指定されたオブジェクトは GC
     から見ると「参照されていない」ことに
 –   他にそのオブジェクトを参照しているものが存在しなけ
     れば GC は遠慮無くオブジェクトを削除する
 –   (時間の都合上,詳しい説明はなし)
key にオブジェクトが指定可能
key にオブジェクトが指定可能 (1/2)
? {}?Object() は key に文字列しか指定できない
  – 文字列以外を渡すと ToString される
key にオブジェクトが指定可能 (2/2)
? WeakMap は key にオブジェクトが指定可能
 – 「オブジェクトしか」指定できない
 – プリミティブ値を指定するとエラー
使い道は?
オブジェクトの外部拡張 (1/2)
? 「オブジェクトを拡張して付加情報を持たせたいが,そ
  れができない」ということは良くある
? 例)
 – DOM ノードに独自プロパティを持たせると色々マズい
    ? “What's wrong with extending the DOM”
         – http://perfectionkills.com/whats-wrong-with-extending-the-dom/
 – ECMAScript 5 ではオブジェクトの拡張を禁止できる
    ? Object.freeze(obj)


                                                   “bar”
                プロパティの追加
   obj                                     obj
                                                   “foo”
オブジェクトの外部拡張 (2/3)

? オブジェクト自体は拡張せず,外に付加情報を持つ
  – オブジェクトを指定すると付加情報を取り出せる
? WeakMap を利用
  – キーとして外部拡張したいオブジェクトを指定
  – 値として付加情報(の集合)を指定
    ? ここに付加情報を突っ込んでいく
? 利点
  – オブジェクトを汚染しない
  – オブジェクトが(GC によって)破棄されると,付加情報も一緒
    に破棄される
オブジェクトの外部拡張 (3/3)
 オブジェクト    付加情報一覧


 付加情報一覧をオブジェクト毎に準備



 付加情報の設定



 付加情報の取得




  node1, node2 を汚染せずに付加情報を持たせられた!
new WeakMap();
参考文献
[[harmony:weak_maps]]
  http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps

ES.next
  http://www.slideshare.net/BrendanEich/esnext

WeakMap uniq
  http://d.hatena.ne.jp/murky-satyr/20110603/uniqmap
What's wrong with extending the DOM
  http://perfectionkills.com/whats-wrong-with-extending-the-dom/




                   ご清聴ありがとうございました

More Related Content

ES.next WeakMap