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()//2
//foo是一個函數,也可以說是一個對象,所以它也可以掛載一些屬性和方法,在5行其上掛載了一個getName方法
//執行的結果是2
getName()//4
//8行有一個全局函數,全局函數聲明提前后被7行的getName覆蓋,所以輸出4
foo().getName()//1
//foo()執行完成后,將全局的getName也就是window.getName給更改后返回this,而在這里this執行的就是window,所以最后執行的就是window.getName,所以輸出1
getName()//1
//在上面已經更改全局的getName,所以依然是1
new foo.getName()//2
//new 操作符在實例化構造器的時候,會執行構造器函數,也就是說,foo.getName會執行,輸出2
new foo().getName()//3
//new操作符的優先級較高,所以會先new foo()得到一個實例,然后再執行實例的getName方法,這個時候,實例的構造器里沒有getName方法,就會執行構造器原型上的getName方法
new new foo().getName()//3
//先執行new foo()得到一個實例,然后在new 這個實例的getName方法,這個時候會執行這個方法,所以輸出3
?