本题旨在深刻了解原型、面向对象、运算符优先级的综合考查。
function Foo() {
getName = function(){
console.log(1)
}
return this
}
Foo.getName = function(){、
console.log(2)
}
Foo.prototype.getName = function(){
console.log(3)
}
var getName = function () {
console.log(4)
}
function getName() {
console.log(5)
}
Foo.getName()
getName()
Foo().getName()
getName()
new Foo.getName()
new Foo().getName()
new new Foo().getName()
思维导图:

解析:
- 先函数提升,加载了
function Foo,function getName,此时getName输出5,然后加载var getName,覆盖了前面的getName,此时getName输出4。 - 接着执行代码
Foo.getName(),直接输出2。 - 执行
getName(),输出4。 - 执行
Foo().getName(),先执行Foo(),使得getName输出1,返回的 this 是 window。所以this.getName()就是全局的getName,输出1。 - 执行
getName(),输出1。 - 执行
new Foo.getName()和new Foo().getName(),根据运算符优先级,函数调用…(…)的优先级是19,成员访问.是19,带参数列表的new是19,无参列表的new是18。所以new Foo.getName()先执行Foo.getName(),输出2。new Foo().getName()从左到右依次执行,new Foo()相当于创建实例 xxx,实例的getName()方法要从原型上去找,因此xxx.getName()输出3。 - 执行
new new Foo().getName(),从最后一个new开始,new Foo()得到实例xxx,然后相当于new xxx.getName(),属于无参列表的new,先执行xxx.getName(),输出3。
因此,答案是:2 4 1 1 2 3 3。