在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指向的一些知識點啦!
第一次寫類似這樣的文章,還是有點小緊張。我希望這篇文章能夠幫助到一些對這塊知識點還不是太明白的朋友。如果有什麼不對的地方還請各位大佬指正!
完結,撒花!!!