CoffeeScriptつかいはじめてみた
Javascriptの何がつらいって、ローダーがないとか色々あるけど、個人的にはOOPが辛い事だとおもうんですよね。*1
まあ、1日以下で書けるような物ならいらないけど、今ちょっとだけややこしいWebアプリを書いてて、やっぱクラスとか使いたくなっているわけですよ。
ということで、今日から真面目にCoffeeScriptを使い始めた。
使い方について、色んなサイトに載ってるんだけど、実際の所、別にnode.jsとかいれなくても
<script type="text/javascript" src="lib/coffee-script.js"></script> <script type="text/coffeescript" src="lib/test.coffee"></script> <script type="text/coffeescript"> alert 1 </script>
とか書いておけば動くので、当座これでいいんじゃないの。
最終的なデプロイ時には速度的にもったいないのはわかるし、デバッグもちょっとだけ辛いんだけど(動的に生成されたJSコードはMinifyされてて、デバッガが使えない…)、まあ、ちょっとだけ書く程度ならIEでJS書いてると思えばいい程度だし…。
ただ、を後からwriteとかIncludeしたりとかしてはやそうとしても無理。これはちょっと残念。
- -
class JsonData loadFromUrl:(url) -> @loadingStartFunc data = $.ajax({ url: url, cache: false, dataType: 'text', }).success( @loadingSuccessFunc(this) ).fail( @loadingFailFunc ).always( @loadingEndFunc ) ## class List extends JsonData data : {} sourceUrl: LISTS_JSON_URL constructor: () -> @loadingStartFunc = -> #console.log 'start' @loadingFailFunc = -> #console.log 'fail' @loadingEndFunc = -> #console.log 'end' @loadingSuccessFunc = (_this) -> (json)-> _this.data = eval(json) $('#src_list_ul').trigger('e_reload_list') @load() reload:() -> @loadFromUrl(@sourceUrl) load:() -> @data = [] # TODO load from local database. getData:() -> @data ## @List = List
Pythonと一緒で、インデントでブロックわけするのは個人的には微妙なんだけど、多分慣れだろうなー。
でもまあ、CoffeeScript良い感じですね。
今回モデル的な所だけはCoffeeで書こうかなーっておもってますよ、はい。
最後の行の
@List = List
については、CoffeeScriptはスコープがガチガチで、1ファイル(1Scriptエレメント)の外には、通常何も投げ出すことができないので(いわゆるグローバル汚染がウッカリでできない)、本来はどうやるのが普通なのかしらないんだけど、これでwindow.Listに、作ったListクラスを適当にはやしている。
@はthis.に相当し、CoffeeScriptの一番上位でのthisはwindowにあたる。
window.myClass.Listとかにすべきかなーとかまあ色々思うんだけど、そもそも正しい解決策が知りたい。
あと、for inの書き方で、
addCell src for src in list.getData()
…いまいちよくわかんない、これなんでsrc二つあるの…。