Javascript ES6,为什么我不能使用带箭头功能的`new`?

时间:2016-06-02 09:28:43

标签: javascript function ecmascript-6 arrow-functions

据我所知,箭头功能与普通功能类似。我这样使用时没有问题:

let X = () => {};
let Y = function() {};
X();
Y();

但是,当我将其与new

一起使用时发生错误

let X = () => {};
let Y = function() {};
x = new X();
y = new Y();

Uncaught TypeError: X is not a constructor

请你解释一下为什么?非常感谢。

2 个答案:

答案 0 :(得分:11)

您可能希望澄清您的问题。

问。 我做错了什么?

A。您使用了new箭头功能,并且不允许这样做。

问。 我可以将箭头功能转换为构造函数吗?

A。只能将其包装在正常的功能中,这很愚蠢。 您无法将箭头函数本身转换为构造函数。

问。 您能解释一下规范如何禁止new使用箭头功能吗?

A. 要成为构造函数,函数对象必须具有 一个[[Construct]] 内部方法。

使用function创建的功能 关键字是构造函数,一些内置函数也是如此 例如Date。这些是您可以使用new

的功能

其他功能对象没有[[Construct]] 内部方法。这些包括箭头功能。所以你不能 使用new。这是有道理的,因为你can't set the this value of an arrow function

某些内置函数也不是构造函数。例如。您 不能new parseInt()

问。 您能否解释禁止new背后的理由 使用规范中的箭头函数?

A。使用常识,或搜索es-discuss archives

答案 1 :(得分:1)

箭头功能与普通功能不同。箭头函数中的argumentsthis引用它们的外部函数。

执行代码new Foo(...)时,会发生以下情况:

  1. 创建一个新对象,继承自Foo.prototype。
  2. 使用指定的参数调用构造函数Foo,和 与此绑定到新创建的对象。新的Foo是等价的 到新的Foo(),即如果没有指定参数列表,则调用Foo 没有参数。
  3. 构造函数返回的对象 成为全新表达的结果。如果是构造函数 函数没有显式返回一个对象,即创建的对象 改为使用步骤1。 (通常构造函数不返回值, 但如果他们想要覆盖正常,他们可以选择这样做 对象创建过程。)
  4. 由于箭头函数中的this引用其外部函数(箭头函数从其声明上下文继承this,如@Iven所说),使用new关键字和箭头函数没有意义。