(想直接看題目的話可以移到最後一個標題!)
在準備回答問題前,先複習幾個觀念:
→ Constructor建構子,用途是能製作大量相似的 object ( array, function...都是object)。
通常使用的形式為:
範例:
function Person(name, age, country){ // 字首大寫
console.log(this); // 這裡的this 會指向一個 empty object "Person {}"
this.name = name,
this.age = age,
this.country = country
}
let Tina = new Person("Tina", 22, "Taiwanese"); // 使用 "new" keyword
console.log(Tina); // Person {name: "Tina", age: 22, country: "Taiwanese"}
範例執行的動作:
console.log(this);
Tina
本身,也就是創造了一個empty object "Person {}"。this.name = name
let Tina = new Person("Tina", 22, "Taiwanese");
console.log(Tina);
( 注意! console.log(this);
的"Person {}"展開來可能還是會看到裡面不是空的,還是會有內容。
這是因為物件傳參考的特性,所以之後被定義的屬性會同時被看到,這裡可以大概知道就好。 )
那如果沒有new會發生什麼事呢? 我們可以試試看:
function Person(name, age, country){
console.log(this); // output: Window {0: global, window: Window, …}
this.name = name,
this.age = age,
this.country = country
}
let Tina = Person("Tina", 22, "Taiwanese");
console.log(Tina); // output: undefined
console.log(this);
的this,會變成指向瀏覽器的Global object Window
。
然後在Window
裡找不到定義屬性的方法,所以Tina
就變成了undefined
(被消失
所以沒有new就不會創造empty object,也會影響this的指向,然後new不出object你的建構子就白搭了。
Constructor Function可以定義屬性,也可以定義方法(methods)。
我們可以看到下面的例子:
function Person(name, age, country){
this.name = name,
this.age = age,
this.country = country,
this.sayHi = function(){
console.log(this.name + " says Hi."); // 這裡的this會指向Person {}
}
}
let Tina = new Person("Tina", 22, "Taiwanese");
console.log(Tina); // Person {name: "Tina", age: 22, country: "Taiwanese", sayHi: ƒ}
Tina.sayHi(); // Tina says Hi.
(但這種建立物件的方式,會占用到大量的記憶體,所以之後會補充Prototype的概念。)
那跟今天的主題比較相關的提問是:
( 問題參考自: 前端工程師面試問題集 ★ Front-end Job Interview Questions )
簡而言之:
function Person(){}
→ 創造一個建構子Person,可以定義屬性和方法,並用於創造object。
var person = Person()
→ 如果沒有寫new的話,Person就不會創造empty object,this會變成指向瀏覽器裡的window
物件。
→ 而window
裡找不到欲定義的屬性,那麼建立的person
會回傳undefined
。
var person = new Person()
→ new 會創造empty object,賦值給person。
→ person就會是一個可以具備Person()屬性,且具有屬性值的object。
【如內文有誤還請不吝指教>< 感謝閱覽至此的各位:D 】
-----正文結束-----
本來是想寫this的,但this會用到這個的延伸觀念,所以今天來寫Constructor Function。