new關鍵字對構造函數做了什么


在javascript中,new關鍵字能讓一個函數變得與眾不同,把new搞清楚了,就明白構造函數中的this指向誰了。

舉個例子

funtion Demo(){
     console.log(this);
}
Demo();//window
new Demo();//demo

很顯然使用new關鍵字之后,函數內部this的指向發生了變化,那么具體發生了什么變化呢,就得搞清楚new關鍵字究竟做了什么。

function New(func){
     //聲明一個中間對象,該對象為最終返回的實例
    var res = {};
    if(func.prototype != null){
    //將實例的原型指向構造函數的原型
   res.prototype = func.prototype;
   }
   //ret為構造函數執行的結果,這里通過```apply```,將構造函數內部的```this```指向修改為指向```res```,即實例對象
   var ret = func.apply(res,Array.prototype.slice.call(arguments,1));
   //當我們在構造函數上明確指定了返回對象時,那么```new```的執行結果就是該返回對象
   if((typeof ret === 'object' || typeof ret === 'function')&&ret != null){
          return ret;
   }
return res;
}

所以在new一個實例的過程中,其實是執行了如下的步驟

  • 1、聲明一個中間對象
  • 2、將該中間對象的原型指向構造函數的原型
  • 3、將構造函數中的this指向該中間對象
  • 4、返回該中間對象,即返回實例對象


免責聲明!

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



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