koa原始碼解析 之 is-generator-function
koa 依賴 is-generator-function
原始碼分析

Function.prototype.toString
從正則表示式 /^\s*(?:function)?\*/

1: GeneratorFunction
不管書寫是 function*
還是 function *
在 Function.prototype.toString
之後為 function*
注意
在 ES2019
的 Function.prototype.toString revision 已經開始返回原始內容, 包含空格
function * fn() {}
Function.prototype.toString.call(fn);
node < 10, 輸出 function* fn() {}
node >=10, 輸出 function * fn() {}
2: function
可選是因為物件簡寫語法
var o = { *fn() {}, }; // *fn() {} console.info(Function.prototype.toString.call(o.fn));
Object.prototype.toString
獲取型別在 ES2015
後不可靠
var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; if (!hasToStringTag) { var str = toStr.call(fn); return str === '[object GeneratorFunction]'; }
ES2015 提供了 [Symbol.toStringTag]
修改 Object.prototype.toString()
返回的型別標籤
function* fn() {} Object.defineProperty(fn, Symbol.toStringTag, { get() { return 'MyTag'; }, }); // [object MyTag] console.log(Object.prototype.toString.call(fn));
獲取 GeneratorFunction
原型
通過 Function
構造一個 GeneratorFunction
, 通過 Object.getPrototypeOf
獲得原型
var getProto = Object.getPrototypeOf; var generatorFunc = Function('return function*() {}')(); var GeneratorFunction = getProto(generatorFunc);