面試題-函數原型

關於原型函數的問題:
	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)
}
函數執行
  1. 執行 Foo 的 getName 方法 輸出;
	Foo.getName() // 2;
  1. 執行的是 var getName = … 會將提升的函數覆蓋;
	getName() // 4
  1. 執行 Foo 函數之後又覆蓋 getName, 接着調用 getName 函數,此時調用getName函數;
	Foo().getName() // 1
  1. 執行 getName() 此時函數還是執行上一步的函數;
	getName() // 1
  1. 此函數執行是考察運算符優先級
	new Foo.getName() // => new (Foo.getName)()  輸出 2;
  1. 此函數執行同樣考察運算符優先級, 但是此時new Foo() 是執行Foo的實例 由於Foo 實例裏面沒有getName 方法,所以會去原型上找protoType;
	new Foo().getName() // => (new Foo()).getName() 輸出 3
  1. 此函數執行同樣考察運算符優先級, 是前面兩個的綜合;
new new Foo().getName() // => new ((new Foo()).getName)() // 3 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章