CoffeeScriptでクラス変数やクラスメソッドを使う

やり方

定義の際に@を頭に付ける。

class Something
	someProp: "hoge"
	someMethod: ->
		...

	@someClassProp: "HOGEHOGE"
	@someClassMethod: ->
		...

どうやってやるんだろうと探したらドキュメントに追記っぽくちょろっと書いてあった。

object itself (the constructor function), you can assign static properties by using
@property: value, and call functions defined in parent classes: @attr ‘title’, type: ‘text’

まあドキュメント自体がちょっと解説のついたチートシートみたいな具合なので、いろいろなことがちょろっと書いてある。

JavaScript的に見ると

@を付けて定義した変数やメソッドは関数オブジェクトのプロパティになる。
@を付けないで定義した変数やメソッドは関数オブジェクトのprototypeのプロパティになる。

単純なコードで書くと以下のような感じか。

Something = function(){};
Something.prototype.someProp = "hoge";
Something.prototype.someMethod = function() { ... }; 

Something.someClassProp = "HOGEHOGE";
Something.someClassMethod = function() { ... };

インスタンスメソッドからクラス変数は使えない。
別のオブジェクトにある変数だし、プロトタイプチェーンでもたどれないから。
(Samething.somePropのようにクラス変数としての呼び出しならもちろん使える。インスタンス変数と同じように呼び出そうとしたら使えないと言うこと)

クラスメソッドからインスタンス変数が使えないのも同じ理由。

2010/01/28追記

JavaScriptのコードをうっかり間違っていたので修正。

CoffeeScriptでクラス変数やクラスメソッドを使う” に対して2件のコメントがあります。

  1. nodamushi より:

    Something.someProp = “hoge”;
    Something.someMethod = function() { … };

    Something.prototype.someClassProp = “HOGEHOGE”;
    Something.prototype.someClassMethod = function() { … };

    のprototypeの位置が逆になってますよ。

  2. akahige より:

    ご指摘ありがとうございます。
    修正しました。

コメントは受け付けていません。