The Wayback Machine - https://web.archive.org/web/20151124214832/https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes

Classes

3 人の貢献者による編集:

この記事は翻訳作業中です。

これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。

草案
このページは完成していません。

ECMAScript 6 で導入されたクラス構文は、既存のプロトタイプによるオブジェクト指向の糖衣構文です。 新しいオブジェクト指向を JavaScript に導入するものではありません。クラス構文を用いることで、クラス定義をより簡潔、明瞭に記述できるようになります。

クラス定義

実際のところ、クラスは関数であり、関数式関数宣言を用いて定義できます。クラス構文には、2つの選択肢があります:

クラス宣言

クラスを定義する一つの方法は、クラス宣言を行うことです。そのためには, "class"キーワードとクラス名を決めなければいけません。 (この例では"Polygon").

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

ホスティング(巻き上げ)

関数宣言では hoisted が行われるのに対し、クラス宣言では行われません。そのためクラスを使用する前に、そのクラスが宣言する必要があります。宣言されていない場合、ReferenceError が送出されます:

var p = new Polygon(); // ReferenceError

class Polygon {}

クラス式

クラス式はクラスを定義するもう 1 つの方法です。これを利用することで、名前つきクラス以外に、無名クラスも定義できます。名前つきの場合、その名前はクラス本体内でのみ有効となります。

// 無名
var Polygon = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

// 名前つき
var Polygon = class Porygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

クラス本体とメソッド定義

中括弧 {} 内にクラス本体を記述します。クラス本体には、メソッドやコンストラクタといったクラスメンバを記述します。

strict モード

クラス宣言、もしくはクラス式で定義されたクラス本体は、strict モード で実行されます。

コンストラクタ

コンストラクタ は、そのクラスによって定義されるオブジェクトの生成時に、初期化を行う特別なメソッドです。"constructor" という名前のメソッドは、クラスに1つしか定義できません。2 回 以上定義されている場合は、SyntaxError が送出されます。

親クラスのコンストラクタは super というキーワードで呼び出せます。

プロトタイプメソッド

メソッド定義 を参照してください。

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  
  get area() {
    return this.calcArea()
  }

  calcArea() {
    return this.height * this.width;
  }
}

静的メソッド

static キーワードを利用すると、クラスへ静的メソッドを定義できます。静的メソッドは、呼び出しに、そのクラスのインスタンスを作成する必要はありません。そのクラスが生成されていれば呼び出せます。静的メソッドは、アプリケーションのユーテリティメソッドの実装によく利用されます。

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }

    static distance(a, b) {
        const dx = a.x - b.x;
        const dy = a.y - b.y;

        return Math.sqrt(dx*dx + dy*dy);
    }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);

console.log(Point.distance(p1, p2));

継承によるクラスの拡張

 extends キーワードをクラス宣言、もしくはクラス式内に記述することで、他のクラスの子クラスを定義できます。

class Animal { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}

組み込みオブジェクトのサブクラス定義

TBD

super による親クラスへの参照

super キーワードを利用することで、親クラスのメソッドを呼び出せます。

class Cat { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Lion extends Cat {
  speak() {
    super.speak();
    console.log(this.name + ' roars.');
  }
}

ES5との比較

TBD

使用例

TBD

仕様

仕様 状態 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Class definitions' in that specification.
Standard Initial definition.

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート 42.0 Available in the Nightly channel only (since February 2015) ? ? ?
機能 Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
基本サポート 未サポート Available in the Nightly channel only (since February 2015) ? ? ? 42.0

関連項目

ドキュメントのタグと貢献者

 このページに貢献する: chikoski, lv7777, GoToLoop
 最終更新者: chikoski,
サイドバーを隠す
HTTPS · web.archive.org
← Home