为啥我不能在 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】:
箭头函数不是普通函数的同义词。 arguments
和 this
内部箭头函数引用它们的外部函数。
当代码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。由于不能用apply
或bind
设置箭头的this
,所以禁止new
的应用也是一致的行为。这是最好的答案。以上是关于为啥我不能在 JavaScript/ES6 中使用带有箭头函数的`new`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章