關於構造函數中this指向一些理解

在ES5中,函數的被執行的方式不同,該函數體中的this指向也可能是不一樣的,因爲只有在函數執行的時候this指向纔開始確定。

當我們用  new 函數名()來執行函數的時候,該函數我們就稱之爲構造函數,他在執行之前會進行預編譯,這個時候會確定this的指向,它會在內部將this指向即將被構造(返回)出來的實例化對象。這裏呢,我們可以這樣理解,系統內部通過Object.create(構造函名.prototype),然後將它返回的值(一個新的隱式原型指向構造函數的原型的對象)賦值給this。接下來的代碼該怎麼執行就怎麼執行,和普通函數一樣。只不過接下來函數體中的this指向的是即將被返回的實例化對象。

接來下,分爲人爲的給函數添加return xxx;這條語句   和    系統默認添加。

     - 如果是系統默認添加,這個好辦,直接給你返回this,注意,這個this是指向即將被返回的實例化對象的。

     - 如果是人爲添加,也分爲兩種情況,看你返回的是什麼類型

             - 如果是原始類型的值,比如(number,string,undefined,null(注意:這裏把null也歸爲原始類型,儘管typeof null返回的是“object”),boolean),那麼系統內部會忽略你自己寫的,還是會給你返回this。

             -如果是引用類型,如(function,array,object),則就按照你給的值返回,這個時候我們最後得到的就不是實例化對象了,而是你自己給出的返回值。

說了這麼多直接上代碼吧,簡潔明瞭!

function Test (){

    this = Object.create(Test.prototype); // 可以這麼去理解,實際上this不能這麼使用。這裏Ob.cerate()的第一個參數表示該函數執行後的返回結果(一個對象)的隱式原型(__proto__)爲Test.prototype(Test函數身上的一個對象,這個對象稱爲Test函數的原型)。

xxx;// 這個代碼段該怎麼執行就怎麼執行,只是this指向是即將被返回的實例化對象

return this; // 如果沒有自己返回一個引用類型,系統就會自動返回this。當然,我們通過new 來執行這個函數,肯定是希望返回一個實例化對象。這裏一般只有面試的時候纔會問到。應該屬於冷門的知識點了。

}


以上就是在ES5中使用new關鍵字來執行函數的關於this指向的一些知識點啦!

第一次寫類似這樣的文章,還是有點小緊張。我希望這篇文章能夠幫助到一些對這塊知識點還不是太明白的朋友。如果有什麼不對的地方還請各位大佬指正!

完結,撒花!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章