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操做符作了些什麼呢?
  1. 建立一個新對象;
  2. 將構造函數的做用域賦給新對象(所以 this 就指向了這個新對象) ;
  3. 執行構造函數中的代碼(爲這個新對象添加屬性) ;
  4. 返回新對象。
問題2:不加new操做符直接執行構造函數會發生什呢?
function Obj(name){
    this.name = name;
    console.log(this); // 嚴格模式下是undefined 非嚴格模式下是window對象
}

var a = Obj("name1");
console.log(a); // 結果 => undefined

哦,原來只是看成正常的函數調用來執行,Obj沒有返回值,故aundefinedjavascript

二者區別總結

使用new操做符建立對象,而且構造函數沒有返回值或者返回爲基本數據類型,那麼返回該對象,以下例:java

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值,若是返回的是一個引用類型,那麼返回該引用類型。this

那麼問題答案你有了嗎?

參考答案 :prototype

function Obj(name){
    this.name = name;
    return this;
}
Obj.prototype.name = "name2";
var a = Obj("name1");
var b = new Obj;
相關文章
相關標籤/搜索