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!!
と表示される。実行は以下。
- ブラウザ起動する
- Ctrl+Shift+Iでデベロッパツールを出す
- コンソールに上記コードをコピペしてEnter
問題提起
JavaScriptではクラスを生成できる。#
でPrivateなメンバ変数やメソッドも書ける。*
でGeneratorでいわゆるイテレータも作れる。なら、PrivateかつGeneratorなメソッドはどうやって書きあらわせばいいの?
という疑問があって試してみた次第でした。
おまけ
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() { ... }