テック技報最新号へ →
コード

JavaScript: #field in obj でプライベートフィールドの有無(ブランドチェック)を判定する

クラス内で #x in obj と書くと、obj がそのクラスのプライベートフィールド #x を持つか(=本物のインスタンスか)を、例外を使わずに判定できる。

@xah_lee · 投稿 2026-09-30
#javascript#es2022#class#privatefields

どんな問題を解決する?

  • 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 になる。

出典

X の元の投稿を開く