WeakMap
要素ノードのプロパティに値を格納した場合、将来的に同じ名前のプロパティが拡張された場合に衝突する危険性があります。
WeakMap
は要素ノードそのものを拡張するわけではないので、要素ノードにどんなプロパティが定義されても自由に設定できます。
Closure に隠す理由には「開発者ツールで内部のデータ見るような人に見られたり編集されたくない」というのもあるようですが(ゲームとか?)、開発者ツールで WeakMap が見えるスコープのところに breakpoint 置いて REPL で操作できるので意味ないです。
WeakMap
の使いどころはスコープを分割できることにあり、ユーザから値を隠す目的で使うものではないと思います。
例えば、 <p id="sample">
に対して a.js と b.js が別々の WeakMap
を定義すれば、それぞれ独立したスコープで値を埋め込む事が出来ます。
a.js で埋め込んだ WeakMap 値が b.js で埋め込んだ WeakMap 値と衝突する可能性はゼロです。
data-* 属性
プリミティブ値で良ければ、定義済みの data-*
属性を使う事も検討に値すると思います。
WeakMap
とは逆にスコープが解放されているのが特徴で他の機能からも参照できるのでうまく使い分けると良いでしょう。
コード事例
JavaScript
1'use strict';
2var mylibraryA = {name: 'A', value: 'foo', flag: true},
3 mylibraryB = {name: 'B', value: 'bar', flag: false},
4 map = new Map([['mylibraryA', mylibraryA], ['mylibraryB', mylibraryB]]),
5 p;
6
79
10p = document.createElement('p');
11map.forEach((object, name) => {
12 for (let key of Object.keys(object)) {
13 p[name + '-' + key] = object[key];
14 }
15})
16console.log(JSON.stringify(Object.keys(p))); // ["mylibraryA-name", "mylibraryA-value", "mylibraryA-flag", "mylibraryB-name", "mylibraryB-value", "mylibraryB-flag"]
17
1820
21p = document.createElement('p');
22map.forEach((object, name) => {
23 for (let key of Object.keys(object)) {
24 p.setAttribute('data-' + name + '-' + key, object[key]);
25 }
26})
27console.log(p.outerHTML); // <p data-mylibrarya-name="A" data-mylibrarya-value="foo" data-mylibrarya-flag="true" data-mylibraryb-name="B" data-mylibraryb-value="bar" data-mylibraryb-flag="false"></p>
28
2931
32p = document.createElement('p');
33map.forEach((object, name) => {
34 p.setAttribute('data-' + name, JSON.stringify(object));
35})
36console.log(p.outerHTML); // <p data-mylibrarya="{"name":"A","value":"foo","flag":true}" data-mylibraryb="{"name":"B","value":"bar","flag":false}"></p>
37
3840
41p = document.createElement('p');
42var wmapA = new WeakMap([[p, mylibraryA]]),
43 wmapB = new WeakMap([[p, mylibraryB]]);
44console.log(JSON.stringify(wmapA.get(p))); // {name: "A", value: "foo", flag: true}
45console.log(JSON.stringify(wmapB.get(p))); // {name: "B", value: "bar", flag: false}
Re: lazex さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/12 13:30
2017/03/12 16:00
2017/03/18 08:51