クラス宣言 class
コード
class Actor{
//コンストラクタ
//ひとつしか定義できない。引数違いで複数用意できない。
//デストラクタは無い。
constructor(name, age){
this.name = name;
this.age = age;
}
//getterとsetter
//ES6ではインスタンスフィールド(プロパティ変数)が定義できない
// let height = 0;
//といったメンバの定義ができない。(初期値を設定しなければ定義できるが正しい仕様なのかは不明)
//そのため、コンストラクタやメソッド内で、プロパティを動的に追加(ここではnameとageがそれ)する。
//もしくはゲッター、セッター機能が提供されているので、それを使う。
get height(){ return this._height; }
set height(value){ this._height = value; }
//メソッド定義
//クラス内で呼び出す場合は、this.メソッド名();
LogStatus(){
return `${this.name}は${this.age}歳です`;
}
//クラスメソッド(クラス自身が持つメソッド staticをつける)
//同じクラス内のクラスメソッドからクラスメソッドを呼び出す場合は this.メソッド名();
//クラス外や、同じクラス内であっても通常のメソッドやコンストラクタから呼び出す場合は クラス名.メソッド名();
static AddNum(a, b){
return a + b;
}
}
let michael = new Actor('マイケル' 20);
//クラスメソッドを呼び出し
console.log( Actor.AddNum(10, 20) );
クラス注意点
public, protected, privateといったアクセス修飾子はない。
クラス定義はホスティング(巻き上げ)がない。
使用箇所よりも先に、class定義が上に書かれていなければならない。
※関数は巻き上げしてくれるが、クラス定義はしてくれないので注意。
クラス宣言、もしくはクラス式で定義されたクラス本体は、strictモードで実行される。
クラス式(無名クラス)
コード
//無名で書ける。
var michael = class{
constructor(name, age){
this.name = name;
this.age = age;
}
};
//名前付きで書いてもいい
var michael = class Actor{
constructor(name, age){
this.name = name;
this.age = age;
}
};
継承 extends
コード
class Actor{
constructor(name, age){
this.name = name;
this.age = age;
}
LogStatus(){
return `${this.name}は${this.age}歳です`;
}
};
class ExActor extends Actor{
constructor(name, age, height){
super(name, age);
this.height = height;
}
LogStatus(){
return `${super.LogStatus()}。身長は${this.height}センチです`;
}
}
Array、Date、Errorなどの組み込みオブジェクトも継承元に出来る。