創建 JavaScript 對象

參考《JavaScript 高級程序設計(第3版)》 

一、工廠模式

採用廣爲人知的工廠模式,抽象了創建具體對象的過程,定義函數來創建對象。

說的簡單點,就是定義一個可以返回一個對象的函數,然後將對象的屬性方法封裝在函數中。


function makeCar(id,name){
    var car = new Object();
    car.id = id;
    car.name = name;
    car.go = function(place){
        alert("go to " + place);
    }
    return car;
}

var carA = makeCar(1,"a");
var carB = makeCar(2,"b");

carA.go("HK");

注意:創建對象無需使用“new”;對象沒有具體的類型,都是Object。


二、構造函數模式

在 ECMAScript 中的特定類型中,例如 Object、Array 等,都有其構造函數。

構造函數模式就是定義構造函數,通過 new 創建對象。


function Car(id,name){
    this.id = id;
    this.name = name;
    this.go = function(place){
        alert("go to "+place);
    }
}

var carA = new Car(1,"A");
carA.go("HK");

注意:構造函數並沒有return,也無需創建Object對象;創建具體對象時用new;對象擁有具體的類型,可以用 instanceof 操作符;對象擁有 constructor 屬性,指向對應的類型。

存在問題:實例化對象的時候會給各個對象創建各自的方法。也就是方法名雖然是相同的,但實質是不同的Function對象。這就無法實現方法的共享性。


三、原型模式與構造函數模式相結合

採用原型模式能夠實現方法的共享性,但是若單純採用原型模式,會存在以下問題:

1、構造函數無法傳參數

2、引用類型的屬性(如數組)會被所有對象所共享

所以很少採用單純的原型模式。

而利用原型模式和構造函數的結合,則既可以實現方法的共享性,又能夠獨佔屬性。

構造函數用於定義私有屬性,而原型則用於定義共享屬性和方法。


function Student(id,name){
    this.id = id;
    this.name = name;
    this.courses = ["Math","English"];
}

Student.prototype = {
    constructor : Student,
    goToClass(class){
        alert("go to "+class);
    }
}

var mike = new Student(1,"Mike");
var john = new Student(2,"John");
mike.courses.push("Chinese");//不會影響john
john.goToClass("Math");
mike.goToClass == john.goToClass; //true


發佈了22 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章