JSでgeneratorを書くとき、メソッドの記法によって*をどこに書くかわからなくなることがあったのでまとめた。
generatorについて
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators
ジェネレーター関数は、イテレーターのファクトリーとして働く、特別な種類の関数です。この関数を実行すると、新しいジェネレーターを返します。function* 構文を使用している場合に、関数はジェネレーター関数となります。
通常の関数式
let g = function* () {};
これは最も一般的でよく見る形で、functionの後に*をつけるだけなので迷うこともない。
オブジェクト内の関数
let obj = {
*g() {}
};
obj.g()
オブジェクト内に関数g()
があった場合のジェネレーター関数の書き方。
関数名の前に*
をつける。
呼び出しはobj.g()
文字列による関数オブジェクト
const generatorName = 'g';
let obj = {
*[generatorName]() {}
};
obj.g()
オブジェクト初期化子による関数。generatorName
という関数名を文字列として指定した時。
その場合も関数名の前だが[]
内にある変数が関数名として評価されるので[]
外に*
をつける。
呼び出しはobj.g()
・クラス内の文字列による関数オブジェクト
const generatorName = 'g';
class Hoge {
*[generatorName]() {}
}
new Hoge().g();
クラス内に書く場合でも同様に*[generatorName]
となる。
Arrow Functionによる関数オブジェクト
できない。
まとめ
どっかに*
をつければいい。