函數建構子、new 與 JavaScript 的歷史
在過去的章節介紹過物件最基本的建立方式 - literal object,這堂課將透過 JavaScript 的歷史來介紹物件的其他建立方式。
JavaScript 在創立初期,作者為了吸引 Java 的開發者使用它,所以在命名上便參考 Java 這個字,但在開發上其實有非常大的不同 ; 其中 new 這個關鍵字便是模仿 Java 而來,但在 Java 中,new 是用來建立一個 class,class 並非 object,而是用來定義並建立 object ; 然而在 JavaScript 中,new 則是被用來建立 object,這也是本堂課將介紹的用法 ; JavaScript 在 ES6 後的本版也有 class 這個關鍵字,但用法則和 Java 完全不同。
new object
前面提到,JavaScript 中的關鍵字 new 和 Java 中的用法並不一樣,那麼當我們透過 new 來建立物件的時候到底會發生什麼事呢 ?
讓我們透過一段程式碼範例來了解:
首先,建立一個函式 person,接著透過 new 來呼叫這個函式並指派給一個變數 john
1 | function Person() { |
讓我們依序拆解這段程式碼,首先,呼叫函式 Person() 其實就和一般呼叫函式相同,會直接執行函式內的程式碼,如果沒有特別 return,就會回傳 undefined,接著前面的關鍵字 new 會建立一個空物件 {},並將函式的 this 指向這個物件,所以當我們透過 console.log 查看 john 時,會得到一個含有兩個屬性 firstname 和 lastname 的物件。

那麼如果再透過 new 函式來建立第二個物件呢 ?
1 | var jane = new Person(); |
會和第一個物件 john 得到一個含有兩個屬性的物件。

但如果我們希望透過 new 來建立的物件能自由地賦予它屬性的值該怎麼做呢 ?
前面提到,這種建立物件的方式其實會先呼叫這個函式,再將它的 this 指向一個新產生的空物件,所以就如同一般函式,我們可以傳入參數,並指派給它的屬性,這麼一來就可以達到自由賦予屬性值的目的了。
1 | function Person(firstname, lastnmae) { |
這種被用來透過關鍵字 new 來建立物件並回傳將 this 指派給新生成空物件的函式就稱為 Function Constructors。