静态方法上的新关键字 Promise.resolve

Keyword new on static method Promise.resolve

我在 Promise.resolve 上看到 'erroneous' 调用 new 关键字,但我很惊讶它有效!有人可以向我解释发生了什么,如果它与省略 new 关键字有任何不同吗?

new Promise.resolve(1)

查看 operator precedence (specifically Member Access, Function Call and new(without argument list)) and new keyword 的 MDN 文档,上面不应该抛出错误,因为我假设表达式的计算方式如下:

new (Promise.resolve(1))

我想我在这里遗漏了一些东西(很明显)。提前致谢!

注意:使用蓝鸟库2.x

new 实际上只是创建一个新对象并调用给定的函数并将 this 设置为该对象。如果 Promise.resolve 在内部根本不使用 this,那么这没有什么区别。此外,如果给定的构造函数 returns 是对象本身,则由 new 创建的隐式对象将被丢弃并使用返回的对象。

因此,new 引入了一个新的中间对象,该对象从 resolve returns 到 Promise 后被丢弃,并将上下文设置为另一个对象,该对象不'好像有什么影响。

Here is a very good answer describing how the new 运算符在 JavaScript.

中工作

本质上发生的事情是 Promise.resolve 被视为构造函数,但是构造的对象被丢弃,因为 Promise.resolve returns 某些东西(您的承诺对象)。

在这种情况下,new 没有害处,因为 Promise.resolve 不依赖于对 this 的访问,如果您愿意,可以简单地将其删除。

相反,将 new 添加到实例方法调用将导致非常奇怪的行为:

let x = Promise.resolve()
new x.then(() => console.log("Resolved")) // Will almost certainly throw an error