Javascript 为什么在这里再次调用new是有效的?
在以下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
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)(
)。