首先new Foo()得到一个空对象{}
第二步向空对象中添加一个属性getName,值为一个函数
第三步new {}.getName()
源代码等价于 var bar = new (new Foo().getName)(); console.log(bar)
先new Foo得到的实例对象上的getName方法,
再将这个原型上getName方法当做构造函数继续new ,
所以执行原型上的方法,打印3
参照:js的运算符优先级
优先级:new(带参数列表)> 函数调用 > new(无参数列表)
原题目
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
在第六问中首先看 new Foo().getName() ,这里运算符优先级括号高于new,实际执行为:(new Foo()).getName()
遂先执行Foo函数,而Foo此时作为构造函数却有返回值。在原题中,返回的是this,而this在构造函数中本来就代表当前实例化对象,遂最终Foo函数返回实例化对象。
之后调用实例化对象的getName函数,因为在Foo构造函数中没有为实例化对象添加任何属性,遂到当前对象的原型对象(prototype)中寻找getName,找到后输出3。