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

Ric*_*cky 6 javascript function ecmascript-6 arrow-functions

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

let X = () => {};
let Y = function() {};
X();
Y();
Run Code Online (Sandbox Code Playgroud)

但是,当我使用它时发生错误 new

let X = () => {};
let Y = function() {};
x = new X();
y = new Y();
Run Code Online (Sandbox Code Playgroud)

Uncaught TypeError: X is not a constructor

你能解释一下为什么吗?非常感谢.

Bug*_*nny 12

箭头函数与普通函数不同义。arguments内部this箭头函数引用其外部函数。

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

  1. 创建一个新对象,继承自 Foo.prototype。
  2. 使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。new Foo 等价于 new Foo(),即如果没有指定参数列表,则调用 Foo 时不带参数。
  3. 构造函数返回的对象成为整个 new 表达式的结果。如果构造函数没有显式返回对象,则使用步骤 1 中创建的对象。(通常构造函数不返回值,但如果想要覆盖正常的对象创建过程,则可以选择这样做。)

由于this箭头函数内部引用其外部函数(箭头函数this从其声明上下文继承,正如 @Iven 所说),因此new在箭头函数中使用关键字并没有真正意义。

  • 嗯,这是非法的*因为*它没有意义。语言设计者不会为了好玩而使事情变得非法。事实上,这确实回答了这个问题。 (5认同)
  • 这并不是说使用带有箭头函数的“new”关键字“没有意义”。这是**非法**。 (2认同)

198*_*983 12

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

问:我做错了什么?

A.您使用new箭头功能,这是不允许的.

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

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

问:你能解释一下规范如何不允许new使用箭头功能吗?

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

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

其他函数对象没有[[Construct]] 内部方法.这些包括箭头功能.所以你不能使用new这些.这是有道理的,因为您无法设置this箭头函数的值.

一些内置函数也不是构造函数.你不能这样做new parseInt().

问:你能解释new 说明书中禁用箭头功能背后的理由吗?

A.使用常识,或搜索es-discuss档案.

  • @Ricky我删除了我的答案,因为[`new`不依赖于构造函数的原型](http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor)。由于您无法使用“apply”或“bind”设置箭头的“this”,因此禁止应用“new”也是一致的行为。这是最好的答案。 (3认同)

归档时间:

查看次数:

2937 次

最近记录:

7 年,2 月 前