阅读 is-generator-function 源码

Function.prototype.toString

从正则表达式 /^\s*(?:function)?\*/可知

1: GeneratorFunction不管书写是 function*还是 function *Function.prototype.toString之后为 function*

注意ES2019Function.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);

文章若有纰漏请大家补充指正,谢谢~~http://blog.xinshangshangxin.comSHANG 殇

原文链接:segmentfault.com

上一篇:scrollTop 瀑布流的关键点 offsetTop
下一篇:ES6 生成器简单运用

相关推荐

  • 🔥手写大厂前端知识点源码系列(上)

    如今前端攻城狮的要求越来越高,会使用常见的API已经不能满足现如今前端日益快速发展的脚步。现在大厂基本都会要求面试者手写前端常见API的原理,以此来证明你对该知识点的理解程度。

    3 个月前
  • 🔥前端面试大厂手写源码系列(上)

    如今前端攻城狮的要求越来越高,会使用常见的API已经不能满足现如今前端日益快速发展的脚步。现在大厂基本都会要求面试者手写前端常见API的原理,以此来证明你对该知识点的理解程度。

    3 个月前
  • 🔥 Promise|async|Generator 实现&amp;原理大解析 | 9k字

    笔者刚接触async/await时,就被其暂停执行的特性吸引了,心想在没有原生API支持的情况下,await居然能挂起当前方法,实现暂停执行,我感到十分好奇。好奇心驱使我一层一层剥开有关JS异步编程的...

    3 个月前
  • (源码分析)为什么 Vue 中 template 有且只能一个 root ?

    引言 今年,疫情并没有影响到各种面经的正常出现,可谓是络绎不绝(学不动...)。然后,在前段时间也看到一个这样的关于 Vue 的问题,为什么每个组件 template 中有且只能一个 root? 可能...

    3 个月前
  • 面试还问redux?那我从头手撸源码吧(中间件篇)

    昨天的文章手写了一版redux的核心源码(https://segmentfault.com/a/1190000016799698),redux库除了数据的状态管理还有一块重要的内容那就是中间件,今天我...

    2 年前
  • 防抖与节流(源码学习)

    最近自己撸了一个轮播图,在点击切换的时候,为了寻求更好的用户体验,引入了节流,在此记录对源码的学习过程 源码来源:underscore(https://github.com/jashkenas/und...

    2 年前
  • 阅读redux源码_compose

    先上源码: 重点看一句就够了: 现在我们先假设一个数组,有3个函数,分别是x,y,z 那么发生什么了,接下来就一步一步解释 1. 变成reduce模式: 2. reduce第一次执行,...

    2 年前
  • 速览vuex源码

    Vuex 源码不过千行,主要使用了 Store 类、ModuleCollection 类、Module 类,结构清晰,下面简单说说 Vuex 中一些主要的源码实现。推荐打开 Vuex 源码一同观看。

    3 个月前
  • 通天6 regeneratorruntime未定义

    loganfsmythBrunoLM(https://stackoverflow.com/users/785065/loganfsmyth)提出了一个问题:Babel 6 regeneratorRun...

    2 年前
  • 逗号操作符以及(0,function)()

    相关链接:https://developer.mozilla.org...(https://developer.mozilla.org/zhCN/docs/Web/JavaScript/Referen...

    2 年前

官方社区

扫码加入 JavaScript 社区