new 操作符 做了什么


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的實例

注意:

  1. 箭頭函數不能作為構造函數,因為箭頭函數沒有自己的this,所以不可以使用new,會報錯!
  2. 如果構造函數在調用時,沒有加new操作符,執行過程中this會為window/undefined,無法正常生成實例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM