new操作符新建了一個空對象,這個對象原型指向構造函數的prototype,執行構造函數后返回這個對象
1、創建一個空的對象
2、鏈接到原型
3、綁定this指向,執行構造函數
4、確保返回的是對象
new過程一共有四個步驟:
題目解析
先看代碼
-
var Func=function(){
-
};
-
var func=new Func ();
new共經過了4個階段
1、創建一個空對象
var obj = new Object();
2、設置原型鏈(當調用構造函數創建一個新實例后,該實例的內部將包含一個指針(內部屬性),指向構造函數的原型對象)
obj.__proto__= Func.prototype;
3、讓Func中的this指向obj,並執行Func的函數體。(創建新的對象之后,將構造函數的作用域賦給新對象(因此this就指向了這個新對象))
var result =Func.call(obj);
4、判斷Func的返回值類型:
如果是值類型,返回obj。如果是引用類型,就返回這個引用類型的對象
if (typeof(result) == "object"){ func=result; } else{ func=obj;; }
默認情況下函數返回值為undefined,即沒有顯示定義返回值的話,但構造函數例外,new構造函數在沒有return的情況下默認返回新創建的對象。
但是,在有顯示返回值的情況下,如果返回值為基本數據類型{string,number,null,undefined,Boolean},返回值仍然是新創建的對象。
只有在顯示返回一個非基本數據類型時,函數的返回值才為指定對象。在這種情況下,this所引用的值就會被丟棄了
參考:https://blog.csdn.net/lxcao/article/details/52792466