Boo*_*jaa 10 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();
Run Code Online (Sandbox Code Playgroud)
输出,
class method
generator method
Run Code Online (Sandbox Code Playgroud)
虽然添加原型i.b,并且调用new i.b()会因为i.b不是构造函数而抛出错误,但我能够做到new i.a(),并且this内部*a获得不同的上下文.
我认为归结为这样一个事实:ES6 生成器方法返回一个包含迭代器和可迭代协议的对象,该对象允许生成器开箱即用,具有可以迭代集合的语言功能(例如 for..of)
来自 MDN 文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator:
为了可迭代,对象必须实现 @@iterator 方法,这意味着该对象(或其原型链上的对象之一)必须具有带有 Symbol.iterator 键的属性。
@bergi 提出的一个很好的观点是生成器方法不需要是构造函数。