舉一個很常見的例子app
function Person(name){ this.name = name;
} Person.prototype.say = function(){ console.log(this.name); } let p = new Person("花花"); p.say(); //花花
爲何會打印出「花花」?爲何構造函數中的 this 就指向了 對象?函數
這就是 new 的原理起的做用:this
一、建立一個類的實例:建立一個空對象obj,而後把這個 obj 對象的 __proto__ 設置爲Person.prototype;即建立一個繼承自Person.prototype的新對象
spa
二、執行構造函數:執行的時候,相應的參數會被傳入,this 會被指定爲第1步建立的新實例;
prototype
三、返回對象:若是構造函數返回了一個新對象,那麼這個新對象會取代步驟1中new出來的實例被返回。若是構造函數沒有返回對象,那麼new出來的結果爲步驟1建立的對象code
New實現對象
function New(Person){ var obj = {'__proto__': Person.prototype}; //第一步
return function() { Person.apply(obj, arguments); //第二步
return obj; //第三步 } }