golangの日記

Go言語を中心にプログラミングについてのブログ

JavaScriptのクラスは無名/匿名クラスにできるし即時newできる

javascript.png



無名クラス

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 するならクラス名をつける意味なし。