1)結果執行的是foo物件的乙個叫做getname()的屬性,而1、4、5中的getname都是作為函式存在,所以可以排除1、4、5
2)剩下兩個中,2是foo物件自身的屬性,3是foo物件原型鏈上的屬性,而自身屬性的優先順序高於原型鏈上的屬性,所以執行結果是2
2、getname(); //4
1)結果執行的是getname函式,而題目**中有3個相關函式,分別是1、4、5
2)1中的getname是定義在foo函式中的函式,由於foo尚未執行,因此它沒有暴露出來,無法被外部呼叫,可以排除
3)4和5都可以被正常呼叫,關鍵在呼叫先後問題
4)由於5是普通函式(優先順序最高),4是匿名函式;js解析時會將5提前至最上方優先解析,而後面解析的4會將5覆蓋,所以執行結果是4
3、foo().getname(); //1
1)結果執行的是foo函式,foo函式中有個返回值是this;this被普通函式呼叫後,指向的物件一定是window物件,所以此處的結果已經可以解析為window.getname(),即呼叫getname()函式
2)由於window.getname()已經被修改為1,所以執行結果是1(??)上面那句話是原作者的解釋,此處還沒理解透徹為什麼1沒有被2覆蓋;下面舉個例子對比下:
//第乙個例子是題目的型別,不明為何上邊fn1的結果未被覆蓋??
function fn1 () fn1() var a = 2 console.log(fn1().a) //1 //第二個例子是我理解的會正常出現覆蓋的情況 function fn1 () fn1() var a = 2 console.log(a) //2
4、getname(); //1
1)執行getname即是執行window.getname;所以執行結果同上題是1
5、new foo.getname(); //2
1)此處考察到了運算子優先順序的問題,就題目所需來看,成員訪問".">new(帶引數)>函式呼叫"()"
(注意,"()"分為函式呼叫及優先運算兩種,優先順序是不同的;原作者開始的解釋就出現了錯誤)
2)結果先執行foo.getname(),結果同第一題為2;而new 2不會有任何變化,因此這裡的結果也是2
6、new foo().getname(); //3
1)從結果來看,應該理解成(new foo()).getname()
這樣執行
2)根據成員訪問".">new(帶引數)>函式呼叫"()"
;成員訪問優先執行,右側是.getname()沒問題
3)左側分為兩種可能:一種是new(帶引數),即(new foo())
;此處結果是構建乙個函式
4)另一種是先執行foo()
函式後再將其結果new
;
5)因為new(帶引數)>函式呼叫"()",所以是執行的(new foo())
,此物件foo()自身沒有getname這個屬性,所以會向上追溯其原型鏈上的屬性,即在此處執行了3;因此結果是3
//這裡就是模擬new foo()的結果
function f() new f() //f {}
關於這點,原作者有解釋如下(還是可以理解的):
建構函式的返回值7、在傳統語言中,建構函式不應該有返回值,實際執行的返回值就是此建構函式的例項化物件。
而在js中建構函式可以有返回值也可以沒有。
1、沒有返回值則按照其他語言一樣返回例項化物件。
2、若有返回值則檢查其返回值是否為引用型別。如果是非引用型別,如基本型別(string,number,boolean,null,undefined)則與無返回值相同,實際返回其實例化物件。
3、若返回值是引用型別,則實際返回值為這個引用型別。
原題中,返回的是this,而this在建構函式中本來就代表當前例項化物件,遂最終foo函式返回例項化物件。
new new foo().getname(); //3
1)這題我其實是懵逼的(懵逼臉 面試題解析
1.繼承執行順序 當兩個類之間有繼承關係時,第一次構造子類的例項時,是按照如下順序進行的 1.子類的靜態成員初始化語句 2.子類的靜態建構函式 3.子類的非靜態成員初始化語句 4.父類的靜態成員初始化語句 5.父類的靜態建構函式 6.父類的非靜態成員初始化語句 7.父類的建構函式 8.子類的建構函式...
JS常見面試題 一
1 js的原型和原型鏈怎麼理解?原型鏈有什麼應用?答 js原型以及原型鏈是js物件導向程式設計的基礎和重點,這個也是筆試和面試常問到的問題。每乙個建構函式都有乙個屬性prototype,這個屬性他指向就是我們常說的建構函式的原型。每當我們通過建構函式要去new乙個例項的時候,new操作符會做些事情,...
JS常見面試題 一
1 js的原型和原型鏈怎麼理解?原型鏈有什麼應用?答 js原型以及原型鏈是js物件導向程式設計的基礎和重點,這個也是筆試和面試常問到的問題。每乙個建構函式都有乙個屬性prototype,這個屬性他指向就是我們常說的建構函式的原型。每當我們通過建構函式要去new乙個例項的時候,new操作符會做些事情,...