次のようなジェネレーター関数があるとします。
var g = function*() {
yield 1;
yield 2;
yield 3;
};
var gen = g();
g
それがジェネレーター関数であるかgen
、イテレーターであるかをプログラムでどのように判断できますか?
これは1つの可能性のようです:
g.constructor.name === 'GeneratorFunction'
より良い方法はありますか?
更新:私はエリックの答えに似たアプローチをとることになりましたが、最初にターゲットプラットフォームでジェネレーターがサポートされているかどうかを最初に判断するために使用しました。実装は次のとおりです。eval
var GeneratorConstructor = (function() {
try {
var generator;
return eval('generator = function*() { yield 1; };').constructor;
} catch (e) {
// If the above throws a SyntaxError, that means generators aren't
// supported on the current platform, which means isGenerator should
// always return false. So we'll return an anonymous function here, so
// that instanceof checks will always return false.
return function() {};
}
}());
/**
* Checks whether a function is an ES6 Harmony generator.
*
* @private
* @param {Function} fn
* @returns {boolean}
*/
function isGenerator(fn) {
return fn instanceof GeneratorConstructor;
}