やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

JSでプライベートかつジェネレータのメソッドを定義する方法

 一瞬ハマったので実際に書いてみた。

結論

    *#generate() { yield 'Generate!!' }

失敗

 以下だとエラーになった。

    #*generate() { yield 'Generate!!' }
SyntaxError: Invalid or unexpected token

 ちがい、わかります? *#なの。#*じゃダメなの。OK? (2023-10-02時点)

全コード

class C {
    *#generate() { yield 'Generate!!' }
    *generate() { yield* this.#generate() }
}
for (let v of new C().generate()) {
    console.log(v)
}

 実行したらGenerate!!と表示される。実行は以下。

  1. ブラウザ起動する
  2. Ctrl+Shift+Iデベロッパツールを出す
  3. コンソールに上記コードをコピペしてEnter

問題提起

 JavaScriptではクラスを生成できる。#Privateなメンバ変数やメソッドも書ける。*Generatorでいわゆるイテレータも作れる。なら、PrivateかつGeneratorなメソッドはどうやって書きあらわせばいいの?

 という疑問があって試してみた次第でした。

おまけ

 async, awaitも使ってみると次の順序になる。

class C {
    async *#generate() { yield 'await Generate!!'; }
    async *generate() { yield* this.#generate() }
}
for await (let v of new C().generate()) {
    console.log(v)
}

 複雑すぎてキツイ。

  • async,*,#の意味なんて覚えられない
  • async,*,#の順序なんて覚えられない
  • async,*,#の間にスペースをつけるべきか否か、よくわからない
    • 全パターンを試すの面倒
    • 仮にスペースOKだと、コードの統一性なくなりそう
  • 本質である関数名や引数が左から右へと押し流されて読みにくい

 短く書けるのはいいけど、合わさると複雑になっちゃうね。

順序の覚え方

 アルファベット順。async, generator, private。単純だね。

    async *#generate() { ... }