スタートページJavascriptCoffeeScript
CoffeeScriptの概要(1)変数の指定(2)制御命令(3)関数← CoffeeScript文法の基本(4)クラス

CoffeeScript文法の基本(4)クラス

    Class 構造の一般形
    継承(inheritance)
    アクセス制御

Class 構造の一般形

class クラス名
  プロパティ 用いる変数(データベースのレコードの属性リスト)の定義
  コンストラクタ 外部からレコードが与えられたときの初期設定
          (並びが同じなら、プロパティ名と異なってもよい)
  メソッド 入力データのクラス内での処理
レコード = new クラス名(変数リスト)
外部からのメソッドの呼び出し

ケース1 基本形

省略をしない記述です。かなり煩雑になります。

  CoffeeScript

class 自動車クラス
    # プロパティ
    車名 = ""
    区分 = ""
    排気量 = 0

    # コンストラクタ
    constructor: (引数1, 引数2, 引数3) ->
        this.車名 = 引数1
        this.区分 = 引数2
        this.排気量 = 引数3

    # メソッド
    車表示: ->
        alert "#{this.車名}, #{this.区分}, #{this.排気量}"

車A = new 自動車クラス "スカイライン", "乗用車", 1500
車A.車表示();
alert 車A.車名



  
  JavaScript

var 自動車クラス, 車A;

自動車クラス = (function() {
  var 区分, 排気量, 車名;

  class 自動車クラス {
    // コンストラクタ
    constructor(引数1, 引数2, 引数3) {
      this.車名 = 引数1;
      this.区分 = 引数2;
      this.排気量 = 引数3;
    }

    // メソッド
    車表示() {
      return alert(`${this.車名}, ${this.区分}, ${this.排気量}`);
    }

  };

  // プロパティ
  車名 = "";
  区分 = "";
  排気量 = 0;

  return 自動車クラス;

}).call(this);

車A = new 自動車クラス("スカイライン", "乗用車", 1500);
車A.車表示();      // スカイライン, 乗用車, 1500
alert(車A.車名);   // スカイライン

ケース2 簡素形

  CoffeeScript

class 自動車クラス
    # コンストラクタ
    constructor: (@車名, @区分, @排気量) ->
    # メソッド
    車表示: ->
        alert "#{@車名}, #{@区分}, #{@排気量}"

車A = new 自動車クラス "スカイライン", "乗用車", 1500
車A.車表示();
alert 車A.車名
  
  JavaScript

var 自動車クラス, 車A;
自動車クラス = class 自動車クラス {
  // コンストラクタ
  constructor(車名, 区分, 排気量) {
    this.車名 = 車名;
    this.区分 = 区分;
    this.排気量 = 排気量;
  }
  // メソッド
  車表示() {
    return alert(`${this.車名}, ${this.区分}, ${this.排気量}`);
  }
};

車A = new 自動車クラス("スカイライン", "乗用車", 1500);
車A.車表示();      // スカイライン, 乗用車, 1500
alert(車A.車名);   // スカイライン

継承(inheritance)

「自動車クラス」をスーパークラスとして、サブクラス「乗用車クラス」を定義します。
スーパークラスでのプロパティ「車名、区分、排気量」の設定を継承し、さらに「乗車人数」を加えます。

  CoffeeScript


class 自動車クラス
    constructor: (@車名, @区分, @排気量) ->
    車名表示: ->
        alert @車名







# サブクラス
class 乗用車クラス extends 自動車クラス
    constructor: (車名, 区分, 排気量, @乗車人数) ->
        super(車名, 区分, 排気量)
    乗車人数表示: ->
        alert @乗車人数





車A = new 乗用車クラス "スカイライン", "乗用車", 1500, 5

車A.車名表示();
車A.乗車人数表示();
  
  JavaScript

var 乗用車クラス, 自動車クラス, 車A;
自動車クラス = class 自動車クラス {
  constructor(車名1, 区分1, 排気量1) {
    this.車名 = 車名1;
    this.区分 = 区分1;
    this.排気量 = 排気量1;
  }
  車名表示() {
    return alert(this.車名);
  }
};

// サブクラス
乗用車クラス = class 乗用車クラス extends 自動車クラス {
  constructor(車名, 区分, 排気量, 乗車人数) {
    super(車名, 区分, 排気量);
    this.乗車人数 = 乗車人数;
  }
  乗車人数表示() {
    return alert(this.乗車人数);
  }
};

車A = new 乗用車クラス("スカイライン", "乗用車", 1500, 5);

車A.車名表示();      // スカイライン
車A.乗車人数表示();  // 5

アクセス制御

クラス内で設定した関数は、基本的に外部からも利用できます。しかし、セキュリティ等の観点から、外部からの利用をさせない仕組みも必要です。

  「関数 : ->」 public  外部からのアクセスを許す
  「関数 = ->」 private 外部からのアクセスを禁止する
  CoffeeScript


class クラス
    constructor: (@変数A, @変数B) ->

    関数A: ->       # public
        alert @変数A

    関数B = ->      # private
        alert @変数B









データ = new クラス "変数A", "変数B"
alert データ.変数A
alert データ.変数B

データ.関数A()  # public関数 
データ.関数B()  # private関数
  
  JavaScript

var クラス, データ;
クラス = (function() {
    var 関数B;
    class クラス {
        constructor(変数A, 変数B) {
            this.変数A = 変数A;
            this.変数B = 変数B;
        }
        関数A() {
            return alert(this.変数A);
        }
    };
    関数B = function() {
        return alert(this.変数B);
    };
    return クラス;
}).call(this);

データ = new クラス("変数A", "変数B");
alert(データ.変数A);  // 変数A
alert(データ.変数B);  // 変数B

データ.関数A();       // 変数A
データ.関数B();       // エラーになる