为啥我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制]

Posted

技术标签:

【中文标题】为啥我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制]【英文标题】:Why can I not use `new` with an arrow function in JavaScript/ES6? [duplicate]为什么我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制] 【发布时间】:2016-10-01 22:52:41 【问题描述】:

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

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

这是为什么呢?

【问题讨论】:

错误本身给了你一个答案......你将 X 定义为一个空对象,而不是一个构造方法/函数,因此你不能用“new X();”调用它表达。 嗯,我明白了。但我想知道为什么new Y() 不会导致错误。也许 JS 用函数而不是箭头函数做了一些神奇的事情? link 可以帮到你 另见***.com/questions/34361379/…。 箭头函数不能用作构造函数,如文档here中所述 【参考方案1】:

箭头函数不是普通函数的同义词。 argumentsthis 内部箭头函数引用它们的外部函数。

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

    创建了一个新对象,继承自 Foo.prototype。 使用指定的参数调用构造函数 Foo,并且 将此绑定到新创建的对象。 new Foo 是等价的 到 new Foo(),即如果没有指定参数列表,则调用 Foo 没有参数。 构造函数返回的对象 成为全新表达式的结果。如果构造函数 函数没有显式返回一个对象,创建的对象是 而是使用第 1 步。 (通常构造函数不返回值, 但是如果他们想覆盖正常,他们可以选择这样做 对象创建过程。)

由于箭头函数内部的this 引用了它的外部函数(箭头函数从其声明上下文继承this,正如@Iven 所说),将new 关键字与箭头函数一起使用并没有真正意义。

【讨论】:

我刚刚读到它。但还是不明白为什么我不能创建这样的对象 这个答案与问题无关,这就是为什么箭头函数不能作为构造函数。 这并不是说使用new 关键字和箭头函数“没有意义”。这是非法【参考方案2】:

问。我做错了什么?

答。您将new 与箭头函数一起使用,这是不允许的。

问。我可以把箭头函数变成构造函数吗?

A. 仅将其包装在普通函数中,这很愚蠢。 你不能把箭头函数本身变成构造函数。

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

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

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

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

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

Q.你能解释一下拒绝new的理由吗? 规范中有箭头函数吗?

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

【讨论】:

@Ricky 我删除了我的答案,因为new doesn't depend on the constructor's prototype。由于不能用applybind 设置箭头的this,所以禁止new 的应用也是一致的行为。这是最好的答案。

以上是关于为啥我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript ES6 - 函数扩展

JavaScript ES6 - 函数扩展

在 Javascript ES6 模块中访问 Vuex 操作

JavaScript es6 class类的理解。

没有名称的Javascript ES6导入[重复]

在Class里面的Javascript ES6 addEventListener