[英]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.