前言
在經典的面相對象語言程式設計中,Constructor是一種在記憶體已配置設定給該對象的情況下,用于初始化新建立對象的特殊方法。在Javascript中,幾乎所有東西都是對象,我們通常最感興趣的是object構造器。
object構造器用于建立特定類型的對象——準備好對象以備使用,同時接收構造器可以使用的參數,以在第一次建立對象時,設定成員屬性和方法的值。
基本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個問題。
- 它使得繼承變得困難;
- 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對象之間共享了^_^