c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

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したりとかしてはやそうとしても無理。これはちょっと残念。

  • -

で、やっぱりOOPがすごい書きやすい…*2

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二つあるの…。

どうでもいいけど

「貴方はこのthisですよね?」
「いいえ、私はこのthisです」
「えっ、じゃああのthisはどこにいったんですか?」
「しりません、私はあくまでこのthisです」
「そのthisでもなく?」
「このthisです」

久々にJS書くと、どうしてもthisが行方不明になる。
上のコードのajaxの所、1時間悩んだ、まだ脳みそのモードがJSの非同期脳、クロージャ脳になってない…。
さっさと切り換え無いと…。

*1:Perlもか…Mooooooooooooose

*2:ボクは基本OOPは継承ができればいいです…、情弱ぴちぱーなので。