2013年6月1日土曜日

[CoffeeScript]インスタンスメソッドとインスタンス変数

  • インスタンス変数
    コンストラクタやメソッド内で「@」で始まる変数を作るとインスタンス変数となる
  • インスタンスメソッド
    コンストラクタ内で「@」から始まるメソッドを定義するとインスタンス(インスタンス毎に異なる)メソッドとなる。
    クラス直下にメソッドを定義すると全てのインスタンスで共有されるインスタンスメソッドとなる。(prototypeに追加されるメソッド)

# class宣言
class Book

  # コンストラクタ
  constructor : (title, author) ->
    # インスタンス変数に値を設定
    @title = title
    @author = author

    @getTitle = -> title
    @getAuthor = -> author

  # インスタンスメソッド(すべてのインスタンスで同一のメソッド)
  toString : ->
    "title->#{@title}:author->#{@author}"


book = new Book("タイトル", "ほげ")
console.log book.toString()

JavaScriptに変換した結果

インスタンス変数やインスタンスごとのメソッドは「this」に追加されている。
インスタンスで共有されるインスタンスのメソッドはBookクラスの「prototype」に追加されている。
// Generated by CoffeeScript 1.6.2
var Book, book;

Book = (function() {
  function Book(title, author) {
    this.title = title;
    this.author = author;
    this.getTitle = function() {
      return title;
    };
    this.getAuthor = function() {
      return author;
    };
  }

  Book.prototype.toString = function() {
    return "title->" + this.title + ":author->" + this.author;
  };

  return Book;

})();

book = new Book("タイトル", "ほげ");

console.log(book.toString());