Class Definitions | ||
---|---|---|
ES2022 (13) | ES2021 (12) | ES2020 (11) |
Method Definitions | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
The super Keyword | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
The this Keyword | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
Relational Operators (PrivateIdentifier in ShiftExpression) | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
// クラス宣言
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 親クラス名] { クラス内定義 (クラス定義と同等) }
// 巻き上げなし
// const dummy = new MyClass();
// 例外 ReferenceError: can't access lexical declaration 'MyClass' before initialization
// クラス宣言
class MyClass {
publicField = 'Public Field (MyClass)';
}
// 再宣言不可
// class MyClass { }
// 例外 Uncaught SyntaxError: Identifier 'MyClass' has already been declared
console.log(typeof MyClass);
// 出力:function
let obj = new MyClass();
console.log(obj instanceof MyClass);
// 出力:true
console.log(typeof obj);
// 出力:object
console.log(obj.publicField);
// 出力:Public Field (MyClass)
// クラス式 (クラス名指定)
let MyClass2 = class MyClass002 {
publicField = 'Public Field (MyClass002) Old';
};
// 再宣言可
MyClass2 = class MyClass002 {
publicField = 'Public Field (MyClass002)';
};
console.log(typeof MyClass2);
// 出力:function
obj = new MyClass2();
console.log(obj instanceof MyClass2);
// 出力:true
console.log(obj.publicField);
// 出力:Public Field (MyClass002)
// クラス式 (クラス名省略)
const MyClass3 = class {
publicField = 'Public Field (Unknown)';
};
obj = new MyClass3();
console.log(obj instanceof MyClass2);
// 出力:false
console.log(obj instanceof MyClass3);
// 出力:true
console.log(obj.publicField);
// 出力:Public Field (Unknown)
class Parent {
publicFieldParent = 'Public Field (Parent)';
// コンストラクタ
constructor() {
console.log('Parent:constructor()');
}
// スタティック ブロック
static {
console.log('Static Block (Parent)');
}
}
// 出力:Static Block (Parent)
class Child extends Parent {
publicFieldChild = 'Public Field (Child)';
// コンストラクタ
constructor() {
console.log('Child:constructor()');
super();
}
// スタティック ブロック
static {
console.log('Static Block (Child)');
}
}
// 出力:Static Block (Child)
const obj = new Child();
// 出力:Child:constructor()
// 出力:Parent:constructor()
console.log(obj.publicFieldParent);
// 出力:Public Field (Parent)
console.log(obj.publicFieldChild);
// 出力:Public Field (Child)
console.log(obj instanceof Parent);
// 出力:true
console.log(obj instanceof Child);
// 出力:true
class MyClass {
// コンストラクタ
constructor() {
console.log('constructor()');
this.publicFieldInner1 = 'Public Field Inner 1';
this.publicMethodInner1 = () => { console.log('publicMethodInner1( )'); }
}
// private フィールド
#privateField = 'Private Field';
static #privateStaticField = 'Private Static Field';
// private メソッド
#privateMethod() {
console.log('#privateMethod( )');
return this.#privateField;
}
static #privateStaticMethod() {
console.log('#privateStaticMethod( )');
return this.#privateStaticField;
}
// public フィールド
publicField = 'Public Field';
static publicStaticField = 'Public Static Field';
// public メソッド
publicMethod() {
console.log('publicMethod( )');
this.publicFieldInner2 = 'Public Field Inner 2';
this.publicMethodInner2 = () => { console.log('publicMethodInner2( )'); }
}
static staticPublicMethod() {
console.log('staticPublicMethod( )');
MyClass.publicStaticFieldInner1 = 'Public Static Field Inner 1';
MyClass.publicStaticMethodInner1 = () => { console.log('publicStaticMethodInner1( )'); }
}
// public メソッド (セッター・ゲッター)
get publicProperty() {
console.log('get publicProperty( )');
return this.publicPropertyValue;
}
set publicProperty(value) {
console.log('set publicProperty( )');
this.publicPropertyValue += ' -> ' + value;
}
// public メソッド (プライベート アクセス)
getPrivateField() {
console.log('getPrivateField( )');
return this.#privateMethod();
}
static getPrivateStaticField() {
console.log('getPrivateStaticField( )');
return MyClass.#privateStaticMethod();
}
// static ブロック
static {
console.log('Static Block 1');
MyClass.publicStaticFieldInner2 = MyClass.publicStaticField + ' Inner 2';
MyClass.publicStaticMethodInner2 = () => { console.log('publicStaticMethodInner2( )'); }
}
static {
console.log('Static Block 2');
}
}
// 出力:Static Block 1
// 出力:Static Block 2
// 外部設定
MyClass.staticPublicMethod();
// 出力:staticPublicMethod( )
MyClass.prototype.publicFieldOuter = 'Public Field Outer';
MyClass.prototype.publicMethodOuter = () => { console.log('publicMethodOuter( )'); }
MyClass.publicStaticFieldOuter = 'Public Static Field Outer';
MyClass.publicStaticMethodOuter = () => { console.log('publicStaticMethodOuter( )'); }
// public フィールド (static)
console.log(MyClass.publicStaticField);
// 出力:Public Static Field
console.log(MyClass.publicStaticFieldInner1);
// 出力:Public Static Field Inner 1
console.log(MyClass.publicStaticFieldInner2);
// 出力:Public Static Field Inner 2
console.log(MyClass.publicStaticFieldOuter);
// 出力:Public Static Field Outer
// public メソッド (static)
let value = MyClass.getPrivateStaticField();
// 出力:getPrivateStaticField( )
// 出力:#privateStaticMethod( )
console.log(value);
// 出力:Private Static Field
MyClass.publicStaticMethodInner1();
// 出力:publicStaticMethodInner1( )
MyClass.publicStaticMethodInner2();
// 出力:publicStaticMethodInner2( )
MyClass.publicStaticMethodOuter();
// 出力:publicStaticMethodOuter( )
// インスタンス生成
const obj = new MyClass();
// 出力:constructor()
// public フィールド
console.log(obj.publicField);
// 出力:Public Field
console.log(obj.publicFieldInner1);
// 出力:Public Field Inner 1
obj.publicMethod();
// 出力:publicMethod( )
console.log(obj.publicFieldInner2);
// 出力:Public Field Inner 2
console.log(obj.publicFieldOuter);
// 出力:Public Field Outer
// public メソッド
obj.publicMethodInner1();
// 出力:publicMethodInner1( )
obj.publicMethodInner2();
// 出力:publicMethodInner2( )
obj.publicMethodOuter();
// 出力:publicMethodOuter( )
obj.publicProperty = 'publicProperty';
// 出力:set publicProperty( )
console.log(obj.publicProperty);
// 出力:get publicProperty( )
// 出力:undefined -> publicProperty
value = obj.getPrivateField();
// 出力:getPrivateField( )
// 出力:#privateMethod( )
console.log(value);
// 出力:Private Field
class MyClass {
#privateField = 'Private Field';
static isRelated(obj) {
return #privateField in obj;
}
}
class YourClass {
#privateField = 'Private Field';
}
const myObj = new MyClass();
console.log(MyClass.isRelated(myObj));
// 出力:true
const yourObj = new YourClass();
console.log(MyClass.isRelated(yourObj));
// 出力:false