繁体   English   中英

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

[英]Why are generator methods constructors?

声明为方法的方法(使用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

在向ib添加原型时,调用new ib()会抛出一个错误,因为ib不是构造函数,我能够做new ia() ,而this里面*a得到一个不同的上下文。

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

绝对是ES2015规范的奇怪怪癖。 TC39实际上在7月份进行了长时间的讨论,并决定使发电机不具备new能力

该规范的官方变更于上个月登陆 ,虽然有一些关于破坏事情的担忧,但V8和SpiderMonkey的实施者都赞成继续前进,所以我希望它很快就会停止工作(事实上,它已经抛出了每晚Firefox中的TypeError )。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM