class【クラス】
メモ
概要
〔 例 〕- 他言語の class 相当
- 関数ベースで実装 (typeof で型判定:'function')
- クラス宣言 または クラス式 で定義
- new で生成
- クラス内は、strict モード で実行
- 巻き上げなし (クラスの使用前に、クラス定義が必要:ReferenceError 例外)
- インスタンスはオブジェクトで、対応クラスは instanceof で判定
- 他言語の protected 相当はなし
- クラス宣言〔構文〕〔 例 〕
- クラス名は必須
- 再宣言不可 (SyntaxError 例外)
- クラス式〔構文〕〔 例 〕
- クラス名は省略可
- 再宣言可
サブクラス化
〔 例 〕- extends を指定
- 標準組込みオブジェクトの継承可能
- 親クラスの呼び出し
- 親のコンストラクタが存在する場合、super( ~ ) で明示的に呼び出し
- 親メソッドは、super.親メソッド( ~ ) で呼び出し
コンストラクタ〔構文〕
〔 例 〕- constructor で単一定義 (複数定義:SyntaxError 例外)
- サブクラスでは親コンストラクタは、super( ~ ) で明示的に呼び出し (this 参照前に処理)
- this は生成中のオブジェクト
- this を使用して public フィールド・public メソッド を動的に作成可
private フィールド〔構文〕
〔 例 〕- 複数定義可
- 後から追加は不可
- 参照前に要定義
- static 指定で静的フィールド
- in 演算子で存在確認可 〔 例 〕
private メソッド〔構文〕
〔 例 〕- 複数定義可
- 後から追加は不可
- 参照前に要定義
- static 指定で静的メソッド
public フィールド〔構文〕
〔 例 〕- クラス内に定義可
- 複数定義可
- static 指定で静的フィールド
- 動的に作成可 (インスタンス フィールド)
- コンストラクタ・static なしのメソッド内で、this.public フィールド名に値代入 (this:インスタンス)
- クラスの外部で クラス名.prototype.public フィールド名に値代入
- 動的に作成可 (static フィールド)
- static メソッド・static ブロックで、クラス名.public フィールド名に値代入
- クラスの外部で クラス名.public フィールド名に値代入
public メソッド〔構文〕
〔 例 〕- 複数定義可
- static 指定で静的メソッド
- 動的に作成可 (インスタンス メソッド)
- コンストラクタ・static なしのメソッド内で、this.public メソッドに関数代入 (this:インスタンス)
- クラスの外部で クラス名.prototype.public メソッド名に関数代入
- 動的に作成可 (static メソッド)
- static メソッド・static ブロックで、クラス名.public メソッドに関数代入
- クラスの外部で クラス名.public メソッド名に関数代入
static ブロック〔構文〕
〔 例 〕- クラス評価で一度だけ処理
- 複数定義可 (宣言順に処理)
- static フィールド の初期化に評価値が可能
- 親クラスの static ブロック は サブクラスの初期化の前に処理
外部リンク
- ECMA-262 (英語)
Class Definitions ES2024 (15) ES2023 (14) ES2022 (13) Method Definitions ES2024 (15) ES2023 (14) ES2022 (13) The super Keyword ES2024 (15) ES2023 (14) ES2022 (13) The this Keyword ES2024 (15) ES2023 (14) ES2022 (13) Relational Operators (PrivateIdentifier in ShiftExpression) ES2024 (15) ES2023 (14) ES2022 (13)
構文
(クラス宣言・クラス式)
// クラス宣言
class クラス名[ extends 親クラス名] {
// コンストラクタ (単一定義)
[constructor([引数]) {コンストラクタ処理}]
// private フィールド (複数定義可)
[[static ]#フィールド名[= 初期値];]
// private メソッド (複数定義可)
[[static ]#メソッド名([引数]) {メソッド処理}]
[[static ]*#ジェネレータメソッド名([引数]) {ジェネレータメソッド処理}]
[[static ]async #非同期メソッド名([引数]) {非同期メソッド処理}]
[[static ]async *#非同期ジェネレータメソッド名([引数]) {非同期ジェネレータメソッド処理}]
[[static ]get #プロパティ名 ( ) {ゲッター処理}]
[[static ]set #プロパティ名 (設定値) {セッター処理}]
// public フィールド (複数定義可)
[[static ]フィールド名[= 初期値];]
// public メソッド (複数定義可)
[[static ]メソッド名([引数]) {メソッド処理}]
[[static ]*ジェネレータメソッド名([引数]) {ジェネレータメソッド処理}]
[[static ]async 非同期メソッド名([引数]) {非同期メソッド処理}]
[[static ]async *非同期ジェネレータメソッド名([引数]) {非同期ジェネレータメソッド処理}]
[[static ]get プロパティ名 ( ) {ゲッター処理}]
[[static ]set プロパティ名 (設定値) {セッター処理}]
// static ブロック (複数定義可・クラス利用で一度だけ定義順に処理)
[static {static ブロック処理}]
}
// クラス式
変数 = class[ クラス名][ extends 親クラス名] { クラス内定義 (クラス定義と同等) }