使用工廠模式創建對象,你會發現我們所創建的對象類型都是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);