2015-01-10 39 views
-2

在下面的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)); 

为什么第二种情况会导致在第一个没有按错误“T?

+0

试试'new(Foo.specialConstructor())'来看看你的'new(Foo.specialConstructor)()')的区别。 – Bergi

回答

1

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

  1. 将创建一个新对象
  2. 新对象的内部__proto__变量被设置为Foo.specialConstructor.prototype
  3. Foo.specialConstructor使用创建的对象作为该变量
  4. 由于Foo.specialConstructor执行返回一个非原始值,它由新操作符而不是新创建的对象返回

T他的第二种情况是错误的,因为新的操作员只能在功能上使用。

相关问题