es.next weakmap
TRANSCRIPT
ES.next
WeakMap
id:mooz / @stillpedant
id:mooz / @stillpedant
http://mooz.github.com/index-ja.html
宣伝
本が出ます
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)
objプロパティの追加
obj
“foo”
“bar”
オブジェクトの外部拡張 (2/3)
• オブジェクト自体は拡張せず,外に付加情報を持つ
– オブジェクトを指定すると付加情報を取り出せる
• WeakMap を利用
– キーとして外部拡張したいオブジェクトを指定
– 値として付加情報(の集合)を指定• ここに付加情報を突っ込んでいく
• 利点
– オブジェクトを汚染しない
– オブジェクトが(GC によって)破棄されると,付加情報も一緒に破棄される
オブジェクトの外部拡張 (3/3)
オブジェクト 付加情報一覧
付加情報一覧をオブジェクト毎に準備
付加情報の設定
付加情報の取得
node1, node2 を汚染せずに付加情報を持たせられた!
new WeakMap();
参考文献
[[harmony:weak_maps]] http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps
ES.nexthttp://www.slideshare.net/BrendanEich/esnext
WeakMap uniqhttp://d.hatena.ne.jp/murky-satyr/20110603/uniqmap
What's wrong with extending the DOMhttp://perfectionkills.com/whats-wrong-with-extending-the-dom/
ご清聴ありがとうございました