我正在阅读这篇文章https://davidwalsh.name/es6-generators,我读了
包裹你的头有点奇怪。你也可能想知道,为什么不是var it = new foo()。耸耸肩。语法背后的原因很复杂,超出了我们的讨论范围。
我很感兴趣为什么没有new
运算符来创建生成器迭代器?它提醒我使用工厂或Python构造创建一个对象。
源页面的示例:
function *foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
var it = foo();
答案 0 :(得分:1)
它实际上在specification
生成器函数对象是构造函数...
Generator对象是生成器函数的实例..
每当调用生成器时,生成器都会返回一个新实例,因为它是一个构造函数
不需要new
,因为它始终与使用new
调用的常规函数相同,它返回生成器的新实例,意味着使用new
调用它将是多余的。
function *foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
function bar() {}
var it = foo();
var to = new bar();
var te = bar();
console.log( it, it instanceof foo ); // generator, true
console.log( to, to instanceof bar ); // function, true
console.log( te, te instanceof bar ); // undefined, false

在上面的例子中,我们可以看到调用foo()
生成器函数返回生成器的新实例,这与使用bar()
调用常规new
方法的方式非常相似。
但是,如果设置了这样的值,则将bar()
作为常规函数调用不会返回实例,而只返回undefined
或返回值。
以下是关于它如何相关的规范的概述