在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、返回該中間對象,即返回實例對象