potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

JavaScript プロパティを追加できないクラスを作成する

JavaScriptではclassキーワードでクラスを作成できますが、クラスの実体はObjectなのでプロパティが追加できてしまいます。この動作はObject.seal()静的メソッドで無効化できるため、コンストラクタで自身に適用すればプロパティを追加できないクラスを作成できます。

class A {
    a = 0;
    constructor() {
        // 何もしない。
    }
}

class B {
    a = 0;
    constructor() {
        // 自身をシールする。
        Object.seal(this);
    }
}

const a = new A();
const b = new B();
a.x = 0;
b.x = 0;
console.log(a) // Object { a: 0, x: 0 }
console.log(b) // Object { a: 0 }

既存のプロパティも変更を許さない場合はObject.freeezeも使えますが、通常はget x()で使用するかと思います。