本題旨在深刻了解原型、面向?qū)ο?、運(yùn)算符優(yōu)先級的綜合考查。
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()
思維導(dǎo)圖:

解析:
- 先函數(shù)提升,加載了
function Foo,function getName,此時getName輸出5,然后加載var getName,覆蓋了前面的getName,此時getName輸出4。 - 接著執(zhí)行代碼
Foo.getName(),直接輸出2。 - 執(zhí)行
getName(),輸出4。 - 執(zhí)行
Foo().getName(),先執(zhí)行Foo(),使得getName輸出1,返回的 this 是 window。所以this.getName()就是全局的getName,輸出1。 - 執(zhí)行
getName(),輸出1。 - 執(zhí)行
new Foo.getName()和new Foo().getName(),根據(jù)運(yùn)算符優(yōu)先級,函數(shù)調(diào)用…(…)的優(yōu)先級是19,成員訪問.是19,帶參數(shù)列表的new是19,無參列表的new是18。所以new Foo.getName()先執(zhí)行Foo.getName(),輸出2。new Foo().getName()從左到右依次執(zhí)行,new Foo()相當(dāng)于創(chuàng)建實例 xxx,實例的getName()方法要從原型上去找,因此xxx.getName()輸出3。 - 執(zhí)行
new new Foo().getName(),從最后一個new開始,new Foo()得到實例xxx,然后相當(dāng)于new xxx.getName(),屬于無參列表的new,先執(zhí)行xxx.getName(),輸出3。
因此,答案是:2 4 1 1 2 3 3。