使用工廠模式創建對象,你會發現我們所創建的對象類型都是Object,具體代碼如下:
// 使用工廠模式創建對象
function createPerson(name, age) {
// 創建新的對象
var obj = new Object();
// 設置對象屬性
obj.name = name;
obj.age = age;
// 設置對象方法
obj.sayName = function () {
console.log(this.name);
};
//返回新的對象
return obj;
}
for (var i = 1; i <= 1000; i++) {
var person = createPerson("person" + i, 18);
console.log(typeof person);
}
那這有問題嗎?看起來有,看起來好像又沒有,每創建一個都是對象,但是在實際生活中,人應該是一個確定的類別,屬於人類,對象是一個籠統的稱呼,萬物皆對象,它並不能確切的指明當前對象是人類,那我們要是既想實現創建對象的功能,同時又能明確所創建出來的對象是人類,那麼似乎問題就得到了解決,這就用到了構造函數,每一個構造函數你都可以理解為一個類別,用構造函數所創建的對象我們也成為類的實例,那我們來看看是如何做的:
// 使用構造函數來創建對象
function Person(name, age) {
// 設置對象的屬性
this.name = name;
this.age = age;
// 設置對象的方法
this.sayName = function () {
console.log(this.name);
};
}
var person1 = new Person("孫悟空", 18);
var person2 = new Person("豬八戒", 19);
var person3 = new Person("沙和尚", 20);
console.log(person1);
console.log(person2);
console.log(person3);
那這構造函數到底是什麼呢?我來解釋一下:
構造函數:構造函數就是一個普通的函數,創建方式和普通函數沒有區別,不同的是構造函數習慣上首字母大寫,構造函數和普通函數的還有一個區別就是調用方式的不同,普通函數是直接調用,而構造函數需要使用new關鍵字來調用。
那構造函數是怎麼執行創建對象的過程呢?我再來解釋一下:
調用構造函數,它會立刻創建一個新的對象
將新建的對象設置為函數中this,在構造函數中可以使用this來引用新建的對象
逐行執行函數中的代碼
將新建的對象作為返回值返回
你會發現構造函數有點類似工廠方法,但是它創建對象和返回對象都給我們隱藏了,使用同一個構造函數創建的對象,我們稱為一類對象,也將一個構造函數稱為一個類。我們將通過一個構造函數創建的對象,稱為是該類的實例。
現在,this又出現了一種新的情況,為了不讓大家混淆,我再來梳理一下:
當以函數的形式調用時,this是window
當以方法的形式調用時,誰調用方法this就是誰
當以構造函數的形式調用時,this就是新創建的那個對象
我們可以使用 instanceof 運算符檢查一個對象是否是一個類的實例,它返回true或false
語法格式:
對象 instanceof 構造函數
案例演示:
console.log(person1 instanceof Person);