Upload
kiyoshi-sawada
View
226
Download
0
Embed Size (px)
Citation preview
EWD 3トレーニング・コース #21
Global ストレージの JavaScript 用の抽
象化 (b) JavaScript の永続オブジェクトM/Gateway Developments Ltd.
Rob Tweed訳 : 日本ダイナシステム株式会社 嶋 芳成
2
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
2016/9/16 EWD 3 トレーニング・コース #21
3
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
では、 myDoc.d.e2.f3 を参照することができるでしょうか ?
2016/9/16 EWD 3 トレーニング・コース #21
4
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
これは DocumentNode オブジェクト
2016/9/16 EWD 3 トレーニング・コース #21
5
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
これも DocumentNode オブジェクトでしょうか
このことは、 'd' プロパティが正しい節 ( ノード ) かどうかを知る必要があるということです
2016/9/16 EWD 3 トレーニング・コース #21
6
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
これも DocumentNode オブジェクトでしょうか
2016/9/16 EWD 3 トレーニング・コース #21
7
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
これも DocumentNode オブジェクトでしょうか
2016/9/16 EWD 3 トレーニング・コース #21
8
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
しかし、ひとつの Global の可能性のあるすべての添字を、前もって予測する、あるいは決定することは不可能です
2016/9/16 EWD 3 トレーニング・コース #21
9
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
しかし、ひとつの Global の可能性のあるすべての添字を、前もって予測する、あるいは決定することは不可能です* それを教えてくれるスキーマはありません
2016/9/16 EWD 3 トレーニング・コース #21
10
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.d.e2.f3
しかし、ひとつの Global の可能性のあるすべての添字を、前もって予測する、あるいは決定することは不可能です* それを教えてくれるスキーマはありません* 添字の値は何千、何百万もあり得ますし、階層構造のレベルの数も分かりません
2016/9/16 EWD 3 トレーニング・コース #21
11
Global 節と JavaScript オブジェクトmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"myDoc("x","value")="hello world"
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.x.value
プロパティを、添字の名前を用いて自動的に生成することはできませんそのため、上記の例のような方法では DocumentNode のプロパティやメソッド名にアクセスするとクラッシュすることになります
2016/9/16 EWD 3 トレーニング・コース #21
12
$() 関数myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d')
2016/9/16 EWD 3 トレーニング・コース #21
13
$() 関数myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d')
2016/9/16 EWD 3 トレーニング・コース #21
14
$() 関数myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d')
$():
2016/9/16 EWD 3 トレーニング・コース #21
これが、親である DocumentNode の指定した下位節を表す DocumentNode オブジェクトを返します
15
$() 関数myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = new this.documentStore.DocumentNode('myDoc',['d'])
これは同じことですが、とても冗長です
2016/9/16 EWD 3 トレーニング・コース #21
16
$() 関数を変えるmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d')
2016/9/16 EWD 3 トレーニング・コース #21
17
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
var e2Node = dNode.$('e2');
2016/9/16 EWD 3 トレーニング・コース #21
18
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var dNode = myDoc.$('d');
var e2Node = myDoc.$('d').$('e2');
連鎖することで同じことができます
2016/9/16 EWD 3 トレーニング・コース #21
19
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
2016/9/16 EWD 3 トレーニング・コース #21
20
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
$d が表現する DocumentNode は、 DocumentNode である myDoc のプロパティとしてインスタンス化されます
2016/9/16 EWD 3 トレーニング・コース #21
21
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
$d が表現する DocumentNode は、 DocumentNode である myDoc のプロパティとしてインスタンス化されます
従って、 myDoc.$d としてアクセスできます
2016/9/16 EWD 3 トレーニング・コース #21
22
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
$e2 が表現する DocumentNode は、 myDoc.$d のプロパティとしてインスタンス化されます
2016/9/16 EWD 3 トレーニング・コース #21
23
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
$e2 が表現する DocumentNode は、 myDoc.$d のプロパティとしてインスタンス化されます
これで、 myDoc.$d.$e2 としてアクセス可能です
2016/9/16 EWD 3 トレーニング・コース #21
24
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
$() は どの特定の添字についても1回だけ使う必要があります、
2016/9/16 EWD 3 トレーニング・コース #21
25
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f2Node = myDoc.$('d').$('e2').$('f2');
従って、こうする必要はありません
2016/9/16 EWD 3 トレーニング・コース #21
26
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f2Node = myDoc.$d.$e2.$('f2');
指定された添字については、 $() はすでに先に使われているので、このようにすることができます
2016/9/16 EWD 3 トレーニング・コース #21
27
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f3Value = f3Node.value; // bar3
2016/9/16 EWD 3 トレーニング・コース #21
28
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
var f3Value = myDoc.$d.$e2.$f3.value; // bar3
2016/9/16 EWD 3 トレーニング・コース #21
29
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="bar3"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
myDoc.$d.$e2.$f3.value = 'New value'
2016/9/16 EWD 3 トレーニング・コース #21
30
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="New value"
var myDoc = new this.documentStore.DocumentNode('myDoc');
var f3Node = myDoc.$('d').$('e2').$('f3');
myDoc.$d.$e2.$f3.value = 'New value'
2016/9/16 EWD 3 トレーニング・コース #21
メモリ内ではなくディスク上の値を更新します
『永続的な JavaScript オブジェクト』 です
31
$() 関数を連鎖するmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1")="bar1"myDoc("d","e1","f2")="bar2"myDoc("d","e2","f1")="bar1"myDoc("d","e2","f2")="bar2"myDoc("d","e2","f3")="New value"
myDoc.d.e2.f3 ではなく
myDoc.$d.$e2.$f3 です
2016/9/16 EWD 3 トレーニング・コース #21
$ を先頭に付けることで DocumentNode のプロパティやメ
ソッドにアクセスして 添字ベースのプロパティでクラッシュす
ることはありません