對象
一、引言
在C#和Java語言中,物件導向是以類的方式實現的,特別是繼承這個特性,類的方式繼承表現出了強大的功能,而且也易於學習。javascript不是純的物件導向的語言,而是基於對象的語言,對象的繼承是以原型函數的形式繼承的,很多初學者剛開始接觸的時候不太理解,但是JavaScript這種以原型函數的形式實現物件導向技術,不僅是可行的,而且還為物件導向技術提供了動態繼承的功能,本文主要討論了JavaScript的物件導向技術。
二、原型對象概述
每個JavaScript對象都有原型對象,對象都繼承原型對象的所有屬性。一個對象的原型是由建立該對象的建構函式定義的。JavaScript的所有函數都有一個名為prototype的屬性,該屬性引用了原型對象,該原型對象初始化的時候只有constructor屬性來引用建立該原型對象的對象。JavaScript沒有Class定義類的概念,建構函式就定義了類,並初始化類中的屬性,每個類的成員都會從原型對象中繼承相同的屬性,也就是說,原型對象提供了類的執行個體共用的屬性和方法,這就節約了記憶體。
當讀取一個對象的屬性的時候,JavaScript會先從對象中尋找,如果沒有尋找到,才會到原型對象中尋找該屬性(或方法),所以,尤其是對於方法,最好儲存到原型對象中以便於共用,並且達到節省記憶體的目的,而且原型對象還有一個強大的功能,那就是如果通過建構函式執行個體化一些對象後,再給建構函式的原型對象增加屬性和方法,那麼它原來執行個體化的對象執行個體將會繼承這些增加的屬性和方法。
三、對象屬性、對象方法、類屬性、類方法
每個對象都會有自己單獨的執行個體屬性和執行個體方法的副本,如果執行個體化5個對象,那麼就會有5個對象的執行個體屬性和執行個體方法副本。This關鍵字引用它們的執行個體對象,也就是說,誰操作了執行個體方法,this就引用誰;訪問了哪個執行個體對象的屬性,this就引用這個執行個體對象。
類方法和類屬性只有一個副本,類方法調用的時候必須引用類的名字,例如:Date.setHours();
下面用一個程式來表現執行個體屬性、執行個體方法、類屬性、類方法
function Mobile(kind,brand) {
this.kind=kind;//定義手機的種類,例如GSM/CDMA
this.brand=brand;//定義手機的品牌,this關鍵字表示用該建構函式執行個體化之後的對象
}
/**//*
定義類的第二步是在建構函式的原型對象中定義它的執行個體方法或其他屬性
該對象定義的任何屬性都將這個類的所有執行個體繼承。
*/
//撥號,這裡只是返回電話號碼
Mobile.prototype.dial = function(phoneNo) {
return phoneNo;
};
/**//*
定義類的第三步是定義類方法,常量和其他必要的類屬性,作為建構函式自身的屬性,而不是建構函式
原型對象的屬性,注意,類方法沒有使用關鍵字this,因為他們只對他們的實際參數進行操作。
*/
//開機關機方法
Mobile.turnOn=function() {
return "The power of mobile is on";
}
Mobile.turnOff=function() {
return "The power of mobile is off";
}
//類屬性,這樣他們就可以被用作常量,注意實際上他們並不是唯讀
Mobile.screenColor=64K;//假設該類手機的螢幕顏色都是64K彩屏的
四、子類化
JavaScript支援子類化,只需把子類的原型對象用超類執行個體化即可,但是應該注意,這樣子類化之後就會存在一個問題,由於是用超類執行個體化子類的原型對象取得的,所以就衝掉了自己本身的由JavaScript提供的constructor屬性,為了確保constructor的正確性,需要重新指定一下,子類化的程式例子如下:
/***** 子類化 *****/
//下面是子類建構函式智能型手機
function SmartPhone(os)
{
this.os=os;
}
//我們將Mobile對象作為它的原型
//這意味著新類的執行個體將繼承SmartPhone.prototype,
//後者由Mobile.prototype繼承而來
//Mobile.prototype又由Object.prototype繼承而來
SmartPhone.prototype=new Mobile(GSM,Nokia);
//下面給子類添加一個新方法,寄送電子郵件,這裡只是返回Email地址
SmartPhone.prototype.sendEmail=function(emailAddress) {
return this.emailAddress
}
//上面的子類化方法有一點缺陷,由於我們明確把SmartPhone.prototype設成了我們所建立的一個對象,所以就覆蓋了JS提供
//的原型對象,而且丟棄了給定的Constructor屬性。該屬性引用的是建立這個對象的建構函式。但是SmartPhone對象整合了它的
//父類的constructor,它自己沒有這個屬性,明確設定著一個屬性可以解決這個問題:
SmartPhone.prototype.constructor=SmartPhone;
var objSmartPhone=new SmartPhone();//執行個體化子類
http://www.cnblogs.com/tyrael007/archive/2006/09/22/511932.html