为什么在这里再次拨打新电话是否有效?

时间:2015-01-10 21:25:57

标签: javascript

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

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

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

foo = new Foo.specialConstructor();
console.log(foo.i);

但是,以下代码会导致Uncaught TypeError: object is not a function

foo = new (new Foo(1337));

为什么第二种情况导致错误,而第一种情况却没有?

1 个答案:

答案 0 :(得分:1)

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

  1. 创建新对象
  2. 新对象的内部__proto__变量设置为Foo.specialConstructor.prototype
  3. 使用创建的对象作为此变量执行
  4. Foo.specialConstructor
  5. 因为Foo.specialConstructor返回非原始值,所以它由new运算符而不是新创建的对象返回
  6. 第二种情况是错误,因为new运算符只能用于函数。