为什么GeneratorFunction构造函数实例的类型'?

时间:2017-06-07 19:56:07

标签: javascript ecmascript-6 generator

由于我还在挖掘ES6并且因为我非常好奇并且我总是试图找到所有内容的原因,所以我正在尝试使用生成器函数试图解决像Traceur或Babel这样的编译器如何编译ES6代码到ES5.So我保存了构造函数,其实例是任何生成器函数,我提醒了它的一个实例的类型。结果是'函数'

 window.GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor
 alert(typeof new GeneratorFunction()) // 'function'

据我所知,构造函数的一个实例是一个对象

 alert(typeof new String()) // 'object'
 alert(typeof new Number()) // 'object'

为什么GeneratorFunction()构造函数有函数实例?

2 个答案:

答案 0 :(得分:0)

可能因为typeof new Function() === 'function'也是true。见What is Function's Data Type : function or object? in JavaScript

答案 1 :(得分:0)

在JavaScript中,主要有两个值组:

  • 原语,不能包含属性,是不可变的,并且具有相等的价值
  • 可以保存属性的
  • 对象可能是可变的,并且是引用相等的

主语是字符串,数字,BigInts,符号,布尔值和空值(nullundefined)。

其他所有对象都是对象,包括数组,类实例,日期(不是水果),promise和许多其他东西。

函数是特殊的对象:它们具有对象所具有的所有属性,但还有一个:它们是可调用的(我的意思是[[Call]]可以)。

只允许构造函数返回对象,但是由于函数也是对象,因此返回函数是有效的。 FunctionGeneratorFunctionAsyncFunction也是如此(后两者不能直接使用)。

但是,如果它们是对象,为什么typeof不为它们返回"object"

这有点复杂。 typeof做的事情很奇怪。例如,it returns "object" for null,它实际上是一个原始类型。

但是,returns "function" for every callable object (i.e. function)很有用,因为这是检查对象是否可调用的唯一真实方法(不计算try..catch hacks)。


总而言之,new GeneratorFunction()返回一个函数对象,其对象typeof的表示形式为"function"