プロトタイプを拡張するもの。日本語文字列の拡張ばかりが話題になっていたが、便利なユーティリティ系も豊富。
基本的にプロトタイプを拡張する場合は、他にプロトタイプを拡張するものと競合しないことを確認し、かつ使用していることを明言すること。自分がエンドユーザーであるならば無制限に使って構わないが、プラグイン作成に混ぜるのは、それが本当に必要でない限り控えること。
定義
nodeでもクライアントでも使える。nodeの場合はnpmで。
おまじない
Object.extend()
これを呼ぶことでObjectクラスそのものをsurag.jsで定義されたObjectに拡張される。
つまり、Object.keys({a:'a'}) という呼び方が可能なのだが、{a:'a'},keys() のようにも呼べるようになる。
なお、引数としてオブジェクトを渡すと、そのクラスのみ拡張された状態になる。
Object.watch
プロパティの変更が行われると実行される関数を定義することが出来る
coffee> obj = {a:'a','b':'b'}
coffeee> Object.watch obj,'a',(prop,oldval,newval)->console.log prop,oldval,newval
coffee> obj
{ b: 'b', a: [Getter/Setter] }
coffee> obj.a = 'big brother is watching you!'
a a big brother is watching you!
'big brother is watching you!'
Object.merge
プロパティを混ぜる
どちらをベースにするかは第三引数できまる
coffee> Object.merge {a:1,b:1},{a:2,c:1}
{ a: 2, b: 1, c: 1 }
coffee> Object.merge {a:1,b:1},{a:2,c:1} ,false
{ a: 1, b: 1, c: 1 }
衝突時の挙動を関数で定義する
coffee> Object.merge {a:1,b:1},{a:2,c:1},(key,a,b)->a+b
{ a: 3, b: 1, c: 1 }
ここで紹介したのは一部。
あとで適当に書き足す