声明为方法的方法(使用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
获得不同的背景。
答案 0 :(得分:3)
绝对是ES2015规格的奇怪怪癖。 TC39实际上进行了长时间的讨论back in July,并决定make generators non-new
able。
对规范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提出的一个好处是,生成器方法不需要是构造函数。