关键词new on static方法Promise.resolve

时间:2017-09-25 07:59:15

标签: javascript promise bluebird es6-promise

我在new上看到Promise.resolve关键字'{错误'',但我很惊讶它有效!有人可以向我解释发生了什么,以及是否有任何方式忽略new关键字?

new Promise.resolve(1)

查看operator precedence的MDN文档(特别是成员访问函数调用 new(无参数列表))和new keyword,不应该是上面的抛出错误,因为我假设表达式正在被评估如下:

new (Promise.resolve(1))

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

注意:使用bluebird库2.x

2 个答案:

答案 0 :(得分:1)

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

因此,new引入了一个新的中间对象,由于resolve返回Promise,它将被丢弃,并将上下文设置为不同的对象有任何影响力。

答案 1 :(得分:1)

Here是一个很好的答案,用于描述new运算符在JavaScript中的工作原理。

基本上发生的事情是Promise.resolve被视为构造函数,但是构造对象被丢弃,因为Promise.resolve返回一些东西(你的promise对象)。

在这种情况下,new不会造成任何伤害,因为Promise.resolve不依赖于对this的访问权限,如果您愿意,可以简单地删除它。

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

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