本题旨在深刻了解原型、面向对象、运算符优先级的综合考查。
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。