JavaScriptのクラスは無名/匿名クラスにできるし即時newできる
無名クラス
let Hello = class { constructor(name) { this.name = name; } hello() { console.log('hello', this.name); } } let h = new Hello('Tanaka'); h.hello(); // hello Tanaka
無名クラスを即時 new する。コンストラクタが呼ばれるだけ。
new class { constructor(name) { console.log('hi!', name); } } ('Tanaka');
無名クラスを new して変数に入れる
let h = new class { constructor(name) { this.name = name; console.log('hello', name); // hello Tanaka } hello() { console.log('hello', this.name); } } ('Tanaka'); h.hello(); // hello Tanaka
TypeScriptでトランスパイルすると以下のような出力になる
- ts
new class { constructor(name: string) { console.log('hello', name); } } ('Tanaka');
- js
"use strict"; new /** @class */ (function () { function class_1(name) { console.log('hello', name); } return class_1; }())('Tanaka');
クラスに名前をつけても、即時 new していれば new Hello('name');
はできない。
- ts
let h1 = new class Hello { private name: string; constructor(name: string) { this.name = name; } hello() { console.log('hello', this.name); } } ('Tanaka'); h1.hello(); // エラーになる // let h2 = new Hello('Suzuki'); // 名前 'Hello' が見つかりません。 // h2.hello();
- js
"use strict"; var h1 = new /** @class */ (function () { function Hello(name) { this.name = name; } Hello.prototype.hello = function () { console.log('hello', this.name); }; return Hello; }())('Tanaka'); h1.hello();
まとめ 即時 new するならクラス名をつける意味なし。