为什么生成器方法构造函数?

时间:2015-08-16 20:03:51

标签: javascript generator ecmascript-6

声明为方法的方法(使用ES6增强的对象文字或类)不是构造函数/没有原型链。

但是当通过方法语法声明时,生成器有一个原型链并且是构造函数。

采用以下示例 - (需要v8)

'use strict';
class x {
  *a() { this.b() }
  b() { print('class method'); }
}
let i = new x();
i.a.prototype.b = function() { print('generator method'); };
i.a().next();
(new i.a()).next();

输出,

class method
generator method

将原型添加到i.b时,调用新的i.b()会导致错误,因为i.b不是构造函数, 我能够new i.a(),而this内的*a获得不同的背景。

  • 为什么存在这种差异?
  • 在定义为方法的生成器中使用原型的用例是什么?

2 个答案:

答案 0 :(得分:3)

绝对是ES2015规格的奇怪怪癖。 TC39实际上进行了长时间的讨论back in July,并决定make generators non-newable

对规范landed last month的官方更改,虽然有一些关于破坏事情的担忧,但是V8和SpiderMonkey的实现者都赞成继续前进,所以我希望它能够很快停止工作(并且事实上,它已经在Firefox中引发了TypeError

答案 1 :(得分:0)

我认为这可以归结为ES6生成器方法返回一个包含迭代器和可迭代协议的对象这一事实,它允许生成器开箱即用的语言功能可以迭代集合(例如for..of) )

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator的MDN文档:

  

为了可迭代,对象必须实现@@ iterator方法,这意味着对象(或其原型链中的一个对象)必须具有带有Symbol.iterator键的属性。

@bergi提出的一个好处是,生成器方法不需要是构造函数。