關於原型函數的問題:
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();
分析:代碼執行 存在var 和匿名函數 所以變量提升 以下函數被提升到頂部;
getName = function(){
console.log(5)
}
函數執行
- 執行 Foo 的 getName 方法 輸出;
Foo.getName()
- 執行的是 var getName = … 會將提升的函數覆蓋;
getName()
- 執行 Foo 函數之後又覆蓋 getName, 接着調用 getName 函數,此時調用getName函數;
Foo().getName()
- 執行 getName() 此時函數還是執行上一步的函數;
getName()
- 此函數執行是考察運算符優先級;
new Foo.getName()
- 此函數執行同樣考察運算符優先級, 但是此時new Foo() 是執行Foo的實例 由於Foo 實例裏面沒有getName 方法,所以會去原型上找protoType;
new Foo().getName()
- 此函數執行同樣考察運算符優先級, 是前面兩個的綜合;
new new Foo().getName()