new 操作符 做了什麼 new 運算符創建一個用戶定義的對象類型的實例或具有構造函數的內置對象的實例。 假設 是一個構造函數,通常在創建對象的實例時,要使用 ,eg: , 那麼在調用 的時候,發生了什麼呢? 步驟如下: 1.一個繼承自 Test.prototype 的新對象被創建。可以理解為: 2 ...
new 操作符 做了什麼
new 運算符創建一個用戶定義的對象類型的實例或具有構造函數的內置對象的實例。
假設Test
是一個構造函數,通常在創建對象的實例時,要使用new
,eg:test = new Test()
, 那麼在調用new
的時候,發生了什麼呢?
步驟如下:
1.一個繼承自 Test.prototype 的新對象被創建。可以理解為:
// 創建一個空對象,繼承構造函數的prototype(繼承公共方法)
let temp = {};
temp.__proto__ = Test.prototype
2.使用指定的參數調用構造函數 Test ,並將 this 綁定到新創建的對象。new Test 等同於 new Test(),也就是沒有指定參數列表,Test 不帶任何參數調用的情況。可以理解為:
// 綁定this到新創建的對象,執行構造函數(創建實例的成員變數)
Test.call(temp)
3.由構造函數返回的對象就是 new 表達式的結果。如果構造函數沒有顯式返回一個對象,則使用步驟1創建的對象。(一般情況下,構造函數不返回值,但是用戶可以選擇主動返回對象,來覆蓋正常的對象創建步驟)
//預設情況下,返回最初創建的對象,也可以主動返回對象進行覆蓋
test = temp
如果主動返回的不是對象,則會被無視,還是使用最初創建的對象
function Test() {
return 'test-string'
}
console.log(new Test()) // Test {} 返回的是空對象,為Test的實例
註意:
- 箭頭函數不能作為構造函數,因為箭頭函數沒有自己的
this
,所以不可以使用new
,會報錯! - 如果構造函數在調用時,沒有加
new
操作符,執行過程中this
會為window/undefined
,無法正常生成實例。