Javascript 为什么在这里再次调用new是有效的?

Javascript 为什么在这里再次调用new是有效的?,javascript,Javascript,在以下JavaScript代码中,new使用了两次,但不是错误: function Foo(i) { this.i = i; } Foo.specialConstructor = function() { return new Foo(1337); }; foo = new Foo.specialConstructor(); console.log(foo.i); 但是,以下代码会导致未捕获类型错误:对象不是函数: foo = new (new Foo(13

在以下JavaScript代码中,new使用了两次,但不是错误:

function Foo(i) {
        this.i = i;
}

Foo.specialConstructor = function() {
        return new Foo(1337);
};

foo = new Foo.specialConstructor();
console.log(foo.i);
但是,以下代码会导致
未捕获类型错误:对象不是函数

foo = new (new Foo(1337));

为什么第二种情况会导致错误,而第一种情况不会导致错误?

第一种情况不是错误,因为如果构造函数返回非原语值,则会返回该值而不是创建的对象。因此,简化后会发生以下情况:

  • 将创建一个新对象
  • 新对象的内部
    \uuuu proto\uuuu
    变量设置为
    Foo.specialConstructor.prototype
  • Foo.specialConstructor
    使用创建的对象作为此变量执行
  • 因为
    Foo.specialConstructor
    返回一个非原语值,所以它由新操作符而不是新创建的对象返回
  • 第二种情况是错误,因为新运算符只能用于函数。

    请尝试
    new(Foo.specialConstructor())
    以查看差异(与
    new(Foo.specialConstructor)(
    )。