JavaScript: #field in obj でプライベートフィールドの有無(ブランドチェック)を判定する
クラス内で #x in obj と書くと、obj がそのクラスのプライベートフィールド #x を持つか(=本物のインスタンスか)を、例外を使わずに判定できる。
どんな問題を解決する?
instanceofはプロトタイプを書き換えられると騙せる・別レルム(iframe等)で失敗する- 以前は
try { obj.#x } catch {}で判定する必要があり、冗長だった
コード例
js
class Money {
#amount;
constructor(amount) { this.#amount = amount; }
static isMoney(obj) {
return #amount in obj; // プライベートフィールドを持つか
}
equals(other) {
if (!(#amount in other)) return false;
return this.#amount === other.#amount;
}
}
Money.isMoney(new Money(100)); // true
Money.isMoney({ amount: 100 }); // false注意点
- ES2022(Ergonomic brand checks)。Node.js 16.4+、主要ブラウザは2021年以降のバージョンで対応。TypeScript は 4.5+。
#x in objはそのクラスの本体内でしか書けない(外部からは判定できない)。- 右辺がオブジェクトでないと TypeError になる。