JavaScript
Interview Preparation
建構式(Constructor)是一種在創造物件時,執行初始化的函式。使用new
關鍵字時,參數(arguments)將被傳入Constructor函式。以下分別介紹傳統的constructor function,以及ES6引入的class中的constructor
方法。
要使用constructor創造物件,只需定義一個帶有任意數量參數(arguments)的 JavaScript 函式即可。在函式內部,關鍵字this
指的是正在創造的物件,因此我們可以用this.property
來寫入該物件的屬性。constructor函式的第一個字母最好使用大寫字母,以方便溝通、及避免與一般函式混淆。
例如:
上述例子中,由constructor(也就是Food
函式)所建立的物件稱為實例(Instance),因此,cheese
是一個實例。也可以用constructor.name
的方法取得該物件的constructor function名稱,例如上述例子中:
console.log(cheese.constructor.name) // output: Food
this
指向的是正在建立的物件,所以上述的constructor function如果寫成下面的程式碼,會得到一樣的結果:
new
關鍵字,則不會創造新的物件,而只是單純執行constructor function,因此this
不會指向新物件,而是指向全域物件(global object),也就是window
,因此在上述的例子中,如果把程式碼改成:會得到undefined
的結果以及以下error:
TypeError: Cannot read properties of undefined (reading 'info')
因為此時的this
指向的是全域物件window
,window
中沒有info
這個屬性(property),因此結果是undefined
constructor
方法 (The Class constructor Method)Class是ECMAScript 6 中引入的模板,一樣可以用來創造物件。Class中的constructor和傳統的constructor function類似,用來建立和初始化一個類別的物件,只需定義一個帶有任意數量參數(arguments)的 JavaScript 函式即可。在函式內部,關鍵字this
指的是正在創造的物件。和傳統建構式的差別除了更容易閱讀、減少與一般函式混淆之外,也可以將原型(prototype)的方法直接寫在class裡面。
例如MDN文件中的例子:
上述程式碼可以觀察到幾個重點:
constructor
是class中一種特殊的方法(method),用來建立和初始化一個類別的物件。一個類別只能有一個名為constructor
的特別方法,如果一個 class 出現兩次以上的 constructor
,就會發生 SyntaxError
。get
語法將物件屬性和函式綁定,查找該屬性時會呼叫該函式