class 式は、ECMAScript 2015(ES6)でクラスを定義する方法の 1 つです。function 式と同じように、class 式は名前を付けることも付けないこともできます。名前を付けた場合、クラス名はクラス本体のみローカルです。 JavaScript のクラスはプロトタイプベース継承が使われます。
構文
var MyClass = class [className] [extends] { // class body };
説明
class 式は、class 文と同じような構文を持っています。しかし、class 式ではクラス名(結合識別子; "binding identifier")を省略できますが、class 文では省略できません。また、class 式は、class の再定義/再宣言が可能で、class 文 のような何らかのエラーをスローしません。コンストラクタプロパティはオプションです。そして、このキーワードを使用して生成された class の typeof は常に "functions" になります。
class 文のように、class 式の class 本体は strict mode で実行されます。
'use strict'; var Foo = class {}; // constructor property is optional var Foo = class {}; // Re-declaration is allowed typeof Foo; //returns "function" typeof class {}; //returns "function" Foo instanceof Object; // true Foo instanceof Function; // true class Foo {}; // Throws TypeError, doesn't allow re-declaration
例
簡単な class 式
これは、簡単な匿名 class 式です。変数 "Foo" を使用して参照できます。
var Foo = class { constructor() {} bar() { return "Hello World!"; } }; var instance = new Foo(); instance.bar(); // "Hello World!" Foo.name; // ""
名前付き class 式
class 本体内で現在の class を参照したい場合は、名前付き 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 |