new具體做了什么事情


通俗來說,我們都知道new一般做了下面四件事:

  1、創建一個空對象;

  2、將空對象的原型,指向於構造函數的原型;

  3、將空對象作為構造函數的上下文(改變this指向);

  4、對有返回值的構造函數做判斷處理

 

我們詳細來分析這四個點:

1、創建一個空對象

  這個其實就在內存中開辟一個新的空間,創建一個新的對象。若直接打印一個new對象的話可以看到返回的是一個空對象。

    

 

2、將空對象的原型,指向於構造函數的原型

  將空對象的__proto__指向Foo的原型Foo.prototype,這兩個做 == 判斷的話會返回true。

3、將空對象作為構造函數的上下文(改變this指向)

  若直接執行構造函數的話,此時內部的this指向的是window,因為是全局下。

      

 

 

 

 

 

    

 

 4、對有返回值的構造函數做判斷處理

   如果構造函數有返回值,return的是一個基本類型,則對new,沒有影響

   

  但是,如果返回的是一個引用類型(數組同理),則new就不起作用了

     

 手寫new:

    //定義構造函數
    function Fun(age, name) {
      this.age = age
      this.name = name
      return 1
    }

    function myNew(fn, ...args) {
      //1、先創造空對象
      //其實等於var obj = Object.create({})  
      var obj = {}
      //2、obj的__proto__指向原型
      Object.setPrototypeOf(obj, fn.prototype)
      //3、改變this指向,執行構造函數內部函數
      var result = fn.apply(obj, args)
      //4、判斷return
      return result instanceof Object ? result : obj
    }

 


免責聲明!

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



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