本篇文章主要給大家詳細分析了js建構子建立物件加new與不加new的問題,有這方面興趣的參考學習下。
今天看到這樣一題:
填入"TO DO"處的內容讓下面程式碼支援a.name = "name1"; b.name = "name2";
function Obj(name){ // TO DO } obj. /* TO DO */ = "name2"; var a = Obj("name1"); var b = new Obj;
問題1:new運算子做了些什麼呢?
建立一個新物件;
將建構函數的作用域賦給新物件(因此this 就指向了這個新物件);
執行建構函數中的程式碼(為這個新物件新增屬性);
傳回新物件。
問題2:不加new運算子直接執行建構子會發生什呢?
function Obj(name){ this.name = name; console.log(this); // 严格模式下是undefined 非严格模式下是window对象 } var a = Obj("name1"); console.log(a); // 结果 => undefined
哦,原來只是當作正常的函數呼叫來執行,Obj沒有回傳值,故a是undefined。
兩者差異總結
使用new運算子建立對象,且建構函數沒有傳回值或傳回為基本資料類型,那麼傳回該對象,如下例:
function Obj(name){ this.name = name; } var b = new Obj; console.log(b); // Obj { name: undefined } function Obj(name){ this.name = name; return 'chic'; } var b = new Obj; console.log(b); // 同上
如果建構子回傳一個參考類型:
function Obj(name){ this.name = name; return {}; } var b = new Obj; console.log(b); // {}
總結
對不加new來執行建構函式來說,回傳值就是建構函式的執行結果;對於加new關鍵字來執行建構函式而言,如果return的是基本資料型別,那麼就忽略掉該return值,如果傳回的是一個參考類型,那麼就傳回該參考型別。
那麼問題答案你有了嗎?
參考答案 :
function Obj(name){ this.name = name; return this; } Obj.prototype.name = "name2"; var a = Obj("name1"); var b = new Obj;
上面是我整理給大家的,希望今後會對大家有幫助。
相關文章:
以上是有關在js中建立物件是否加new?的詳細內容。更多資訊請關注PHP中文網其他相關文章!