CoffeeScript – クラスのプロパティ

アクセス可能性

以下のコードで、クラスに関する変数へのアクセス可能性を確認する。

各変数へのアクセス可能性は以下の通り。

定義\引用 クラス インスタンス メソッド内
(@なし)
メソッド内
(@つき)
クラス直下 v=val undef undef undef
@v=val undef undef RefError undef
v:val undef RefError
@v:val undef RefError undef
コンストラクタ v=val undef undef RefError undef
@v=val undef RefError

この表から、以下のように整理できる。特にpublicなインスタンス・プロパティとstaticなクラス・プロパティを使っていくことになる。

クラス直下で@v:val定義 staticなクラス・プロパティ
クラス直下でv:val publicなインスタンス・プロパティ
 コンストラクタで@v=val publicなインスタンス・プロパティ
 クラス直下でv=val  privateなクラス・プロパティ

なお、定義部分のJavaScriptへのコンパイル結果は以下の通り。

クラス・プロパティ

クラス直下で@v:valでプロパティを定義する場合、プロパティはクラスに一つの共有のものとして扱われる。コンパイルされたJavaScriptコードでは正に”[クラス名].[プロパティ名]“となっている

インスタンスの中から参照する場合も、[クラス名].[プロパティ名]で参照する。

publicなインスタンス・プロパティ

クラス直下でv:valと定義した場合とコンストラクタで@v=valと定義した場合は、いずれもインスタンス・プロパティとして扱われる。

挙動としては同じなのでどちらでもよさそうだが、インスタンス・プロパティとしてはコンストラクタで定義する形式の方がよいと考えた。

以下のように、それぞれの定義方法でJavaScriptのコードが異なるが、メソッドのようにクラス内で共通化したい場合はprototypeがよいが、そもそもインスタンスごとに異なる値をとることを想定しているプロパティの場合は、thisによる定義の方が意味に即している。

privateなクラス・プロパティ

クラス直下でv=valと定義すると、そのクラスの各インスタンスで共有されたprivateなプロパティになる。

JavaScriptコードを見るとクラス宣言の最初でvar宣言されているため、クラス内スコープで外からは見えない変数となる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です