クラス宣言

クラスはオブジェクト指向の処理で使う。クラスでは、下記を定義できる。


    クラス宣言の基本

    クラスとは類似する個物を抽象化した設計図。例えばタマやミケという名前の猫それぞれを個物とすると、「猫」という分類がクラス。タマやミケそれぞれの個物をインスンタンス(オブジェクト)という。クラスを定義し、インスタンスを生成・操作してプログラミングの目的を達成する手法。

    以下の例では猫クラスを設計する。

    コンストラクタ

    インスタンスを生成するときはnew クラス名(引数)のようにする。そのときに呼び出される初期化処理をコンストラクタといい、constructorの部分に定義する。具体的には、new 猫('アリス')とすれば、アリスという名前の猫オブジェクトが生成されるように設計。

    インスタンスメソッドとstaticメソッド

    インスタンスだけが呼び出せる関数をインスタンスメソッドといい、インスタンス.メソッド(引数)のように実行する。「そのインスタンスが呼び出す」関数なので、例えば名前を得るメソッドはインスタンスごとに結果が異なる。

    インスタンスメソッドと同様の機能としてアクセサがあり、set セッター(引数)get ゲッター()のように定義する。アクセサは関数ではなく、参照するときはインスタンス.ゲッター、設定するときはインスタンス.セッター = オブジェクトのようにする。

    これらに対して、staticメソッドはクラスで共通の関数であり、クラス.メソッド(引数)のようにして実行する。

    猫クラス

    // 関数宣言と異なり、クラス宣言は定義前の呼び出しはできない
    // new 猫('アリス') // ReferenceError
    
    // クラス宣言による関数定義
    class 猫 {
      // クラス本体はオブジェクトリテラルに似ているが、各メソッド間を,(カンマ)で区切らない
    
      // 1. コンストラクタ
      constructor(名前) {
        this.名前 = 名前 // thisは「そのインスタンスの」という意味になる
      }
    
      // 2. インスタンスメソッド
      名前は() {
        console.log(this.名前)
      }
    
      // 3. static(静的/クラス)メソッド
      static 天敵() {
        console.log('車')
      }
    
      // 4. アクセサ
      get 縄張り() {
        console.log(this.住まい)
      }
      set 縄張り(どこ) {
        this.住まい = どこ
      }
    }
    
    // 1. コンストラクタでインスタンス生成
    // クラス宣言による関数は、new演算子を付けて実行しないとエラー
    // 猫('アリス') // TypeError
    // newで実行するとconstructorが実行され、インスタンスと呼ぶオブジェクトが戻り値となる。
    const アリス = new 猫('アリス')
    console.log(アリス instanceof 猫) // true
    
    // 別のインスタンスを生成
    const タマ = new 猫('タマ')
    
    // 2. インスタンスメソッドの実行
    // インスタンスメソッド内のthisは各インスタンスを示す
    アリス.名前は() // アリス
    タマ.名前は() // タマ
    
    // 3. staticメソッドの実行
    猫.天敵() // 車
    // staticメソッドはインスタンスからは実行できない
    // アリス.天敵() // TypeError
    
    // 4. アクセサ
    // インスタンスのプロパティの参照・代入でアクセサが実行される
    アリス.縄張り = '3丁目'
    アリス.縄張り // 3丁目
    タマ.縄張り // undefined
    

    クラス宣言の再宣言はエラー

    class クラス {}
    //class クラス {} // SyntaxError
    
    // 関数宣言は再宣言や代入ができてしまう
    function 関数() {}
    function 関数() {}
    関数 = 1
    console.log(typeof 関数) // number