一
引言
在C#和Java語言中
面向對象是以類的方式實現的
特別是繼承這個特性
類的方式繼承表現出了強大的功能
而且也易於學習
JavaScript不是純的面向對象的語言
而是基於對象的語言
對象的繼承是以原型函數的形式繼承的
很多初學者剛開始接觸的時候不太理解
但是JavaScript這種以原型函數的形式實現面向對象技術
不僅是可行的
而且還為面向對象技術提供了動態繼承的功能
本文主要討論了JavaScript的面向對象技術
二
原型對象概述
每個JavaScript對象都有原型對象
對象都繼承原型對象的所有屬性
一個對象的原型是由創建該對象的構造函數定義的
JavaScript的所有函數都有一個名為prototype的屬性
該屬性引用了原型對象
該原型對象初始化的時候只有constructor屬性來引用創建該原型對象的對象
JavaScript沒有Class定義類的概念
構造函數就定義了類
並初始化類中的屬性
每個類的成員都會從原型對象中繼承相同的屬性
也就是說
原型對象提供了類的實例共享的屬性和方法
這就節約了內存
當讀取一個對象的屬性的時候
JavaScript會先從對象中查找
如果沒有查找到
才會到原型對象中查找該屬性(或方法)
所以
尤其是對於方法
最好保存到原型對象中以便於共享
並且達到節省內存的目的
而且原型對象還有一個強大的功能
那就是如果通過構造函數實例化一些對象後
再給構造函數的原型對象增加屬性和方法
那麼它原來實例化的對象實例將會繼承這些增加的屬性和方法
三
對象屬性
對象方法
類屬性
類方法
每個對象都會有自己單獨的實例屬性和實例方法的副本
如果實例化
個對象
那麼就會有
個對象的實例屬性和實例方法副本
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=
K;//假設該類手機的屏幕顏色都是
K彩屏的
四
子類化
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
它自己沒有這個屬性
明確設置著一個屬性可以解決這個問題
Smarnstructor=SmartPhone;
var objSmartPhone=new SmartPhone();//實例化子類
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25261.html