new 運算符建立一個用戶定義的對象類型的實例或具備構造函數的內置對象的實例。new 關鍵字會進行以下的操做:app
1.建立一個空的簡單JavaScript對象(即{});
2.連接該對象(即設置該對象的構造函數)到另外一個對象 ;
3.將步驟1新建立的對象做爲this的上下文 ;
4.若是該函數沒有返回對象,則返回this。函數
window.name = "iii" function Person(){ this.name = 3 } Person.prototype.say = function(){ console.log(this.name) } var p1 = new Person(); p1.say() //3 function _new(P){ let o = {}; //1.新建對象 let arg = Array.prototype.slice.call(arguments,1); o.__proto__ = P.prototype; //2.連接對象 // P.prototype.constructor = P; P.apply(o,arg);//3.設置this指向obj(原來指向window)//執行一次構造函數 return o;//4.返回對象 } var p2 = _new(Person) p2.say() //3 console.log(p2 instanceof Person ) //true console.log(p2.construtor === p1.construtor) //true
當代碼 new Foo(...) 執行時,會發生如下事情:this
一個繼承自 Foo.prototype 的新對象被建立。
使用指定的參數調用構造函數 Foo,並將 this 綁定到新建立的對象。new Foo 等同於 new Foo(),也就是沒有指定參數列表,Foo 不帶任何參數調用的狀況。
由構造函數返回的對象就是 new 表達式的結果。若是構造函數沒有顯式返回一個對象,則使用步驟1建立的對象。(通常狀況下,構造函數不返回值,可是用戶能夠選擇主動返回對象,來覆蓋正常的對象建立步驟)prototype