class 式は、ECMAScript 2015 (ES6) でクラスを定義する方法の 1 つです。function 式と同じように、class 式は名前を付けることも付けないこともできます。名前を付ける場合、クラス名はクラス内部のみローカルです。 JavaScript のクラスはプロトタイプベース継承が使われます。
構文
var MyClass = class [className] [extends] { // class body };
説明
class 式の構文は、class 文(宣言) と似ています。ただし、class 式ではクラス名 (束縛識別子; "binding identifier") を省略できますが、class 文では省略できません。また、class 式は、class の再定義/再宣言が可能で、class 文 のように型エラーをスローしません。コンストラクタプロパティはオプションです。また、このキーワードを使って生成したクラスの typeof は常に "functions" になります。
class 文のように、class 式のクラス内部は strict モード で実行されます。
'use strict';
var Foo = class {}; // コンストラクタプロパティはオプション
var Foo = class {}; // 再宣言は可能
typeof Foo; // "function" を返す
typeof class {}; // "function" を返す
Foo instanceof Object; // true
Foo instanceof Function; // true
class Foo {}; // 再宣言は不可能で、TypeError を投げる
例
簡単な class 式
以下は、名前のない簡単な class 式です。変数 "Foo" を使って参照できます。
var Foo = class {
constructor() {}
bar() {
return "Hello World!";
}
};
var instance = new Foo();
instance.bar(); // "Hello World!"
Foo.name; // ""
名前付き class 式
クラス内部で現在のクラスを参照したい場合は、名前付きクラス式を作成してください。この名前は、その class 式自身のスコープ内でだけ見えます。
var Foo = class NamedFoo {
constructor() {}
whoIsThere() {
return NamedFoo.name;
}
}
var bar = new Foo();
bar.whoIsThere(); // "NamedFoo"
NamedFoo.name; // ReferenceError: NamedFoo is not defined
Foo.name; // "NamedFoo"
仕様
| 仕様 | 状態 | コメント |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Class definitions の定義 |
標準 | 最初の定義。 |
| ECMAScript 2017 Draft (ECMA-262) Class definitions の定義 |
ドラフト |
ブラウザ実装状況
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| 基本サポート | 42.0 | 45 (45) | ? | ? | ? |
| 機能 | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|---|
| 基本サポート | 未サポート | 42.0 | 45.0 (45) | ? | ? | ? | 42.0 |