es.next weakmap

22
ES.next WeakMap id:mooz / @stillpedant

Upload: masafumi-oyamada

Post on 26-Jun-2015

7.636 views

Category:

Design


1 download

TRANSCRIPT

Page 1: ES.next WeakMap

ES.next

WeakMap

id:mooz / @stillpedant

Page 3: ES.next WeakMap

宣伝

Page 4: ES.next WeakMap

本が出ます

Page 5: ES.next WeakMap
Page 6: ES.next WeakMap

WeakMap

Page 7: ES.next WeakMap

WeakMap = 連想配列

Page 8: ES.next WeakMap

ECMAScript 6 に導入予定

Page 9: ES.next WeakMap

Firefox 6 より利用可能

Page 10: ES.next WeakMap

WeakMap 用法1. set(key, value)

– key を指定して value を設定

2. get(key)

– key にひもづけられた value を取得

3. has(key)

– key にひもづけられた値があるかチェック

4. delete(key)

– key に対するエントリを削除

※ has, delete は Firefox 独自実装

Page 11: ES.next WeakMap

いまさら連想配列……?

Page 12: ES.next WeakMap

すでに {}・Object() があるけど?

Page 13: ES.next WeakMap

{}・Object() と比較して

1. key にオブジェクトが指定可能

– しかも多くの実装では定数時間で値が取得できる

2. key に指定されたオブジェクトを「弱く」参照

– GC (Garbage Collector) は何からも参照されていないオブジェクトを削除対象とする

– WeakMap の key として指定されたオブジェクトは GC から見ると「参照されていない」ことに

– 他にそのオブジェクトを参照しているものが存在しなければ GC は遠慮無くオブジェクトを削除する

– (時間の都合上,詳しい説明はなし)

Page 14: ES.next WeakMap

key にオブジェクトが指定可能

Page 15: ES.next WeakMap

key にオブジェクトが指定可能 (1/2)

• {}・Object() は key に文字列しか指定できない

– 文字列以外を渡すと ToString される

Page 16: ES.next WeakMap

key にオブジェクトが指定可能 (2/2)

• WeakMap は key にオブジェクトが指定可能

– 「オブジェクトしか」指定できない

– プリミティブ値を指定するとエラー

Page 17: ES.next WeakMap

使い道は?

Page 18: ES.next WeakMap

オブジェクトの外部拡張 (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”

Page 19: ES.next WeakMap

オブジェクトの外部拡張 (2/3)

• オブジェクト自体は拡張せず,外に付加情報を持つ

– オブジェクトを指定すると付加情報を取り出せる

• WeakMap を利用

– キーとして外部拡張したいオブジェクトを指定

– 値として付加情報(の集合)を指定• ここに付加情報を突っ込んでいく

• 利点

– オブジェクトを汚染しない

– オブジェクトが(GC によって)破棄されると,付加情報も一緒に破棄される

Page 20: ES.next WeakMap

オブジェクトの外部拡張 (3/3)

オブジェクト 付加情報一覧

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

付加情報の設定

付加情報の取得

node1, node2 を汚染せずに付加情報を持たせられた!

Page 21: ES.next WeakMap

new WeakMap();