为什么在JavaScript中创建生成器迭代器时没有`new`运算符?

时间:2017-07-19 21:41:45

标签: javascript syntax generator

我正在阅读这篇文章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();

1 个答案:

答案 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或返回值。

以下是关于它如何相关的规范的概述

enter image description here