天天看點

【學習】Javascript設計模式——Constructor構造器模式前言基本Constructor帶原型的Constructor

前言

在經典的面相對象語言程式設計中,Constructor是一種在記憶體已配置設定給該對象的情況下,用于初始化新建立對象的特殊方法。在Javascript中,幾乎所有東西都是對象,我們通常最感興趣的是object構造器。

object構造器用于建立特定類型的對象——準備好對象以備使用,同時接收構造器可以使用的參數,以在第一次建立對象時,設定成員屬性和方法的值。

【學習】Javascript設計模式——Constructor構造器模式前言基本Constructor帶原型的Constructor

基本Constructor

Javascript雖然不支援類的概念,但它确實支援與對象一起用的特殊constructor函數,通過在構造器前面加new關鍵字,告訴Javascript像使用構造器一樣執行個體化一個新對象,并且對象成員由該函數定義。

在構造器内,this關鍵字引用新建立的對象。回顧對象建立,基本的構造器看起來可能是這樣的:

function Car(model,year,miles){
    this.model=model;
    this.year=year;
    this.miles=miles;

    this.toString=function(){
        return this.model+"has done "+this.miles+"miles";
    };
}

var civic=new Car("Honda Civic",,);
var mondeo=new Car("Ford Mondeo",,);

console.log(civic.toString());
console.log(mondeo.toString());
           
分析:上面是一個簡單的構造器模式版本,但它有2個問題。
  1. 它使得繼承變得困難;
  2. toString()這樣的函數是為每個使用Car構造器建立的新對象而分别重新定義的,這不是最理想的構造方式,因為這種函數應該在所有Car類型執行個體之間共享。

帶原型的Constructor

Javascript的prototype屬性相信大家都知道,調用Javascript構造器建立一個對象後,新對象就會具有構造器原型的所有屬性。通過這種方式,可以建立多個Car對象,并通路相同的原型。如下:

function Car(model,year,miles){
    this.model=model;
    this.year=year;
    this.miles=miles;
}
/*使用Object.prototype.newMethod而不是Object.prototype可以避免重新定義prototype對象*/
Car.protoType.toString=function(){
    return this.model+"has done "+this.miles+"miles";
};

var civic=new Car("Honda Civic",,);
var mondeo=new Car("Ford Mondeo",,);

console.log(civic.toString());
console.log(mondeo.toString());
           
這樣toString()的當以執行個體就能夠在所有Car對象之間共享了^_^

繼續閱讀