javascript 面向?qū)ο缶幊?function也是類
既然是用function來(lái)模擬類,所以編寫代碼創(chuàng)建類的關(guān)鍵字還是function。我們創(chuàng)建一個(gè)座標(biāo)點(diǎn)類。
function Point() {
this.X = 0;
this.Y = 0;
};
var zeroPoint = new Point();
alert("當(dāng)前座標(biāo)值( X:" + zeroPoint.X + " , Y:" + zeroPoint.Y + " )");
大家都知道非靜態(tài)類成員的訪問(wèn)需要通過(guò)對(duì)象來(lái)完成,所以先new出了一個(gè)Point類型對(duì)象,再通過(guò)該對(duì)象完成X和Y軸座標(biāo)值的訪問(wèn)。從語(yǔ)法上來(lái)說(shuō),javascript類對(duì)象的創(chuàng)建過(guò)程和C#等差不多,但實(shí)現(xiàn)機(jī)制卻不相同。這里的new創(chuàng)建出了一個(gè)Object,后續(xù)的Point()函數(shù)執(zhí)行時(shí)將其this指向了這個(gè)新的Object對(duì)象。Point中的this.X和this.Y是Point類的兩個(gè)公共成員,所以Point的對(duì)象可以直接對(duì)它們進(jìn)行訪問(wèn)。
說(shuō)到類成員或?qū)ο蟮某蓡T,免不了要提到可訪問(wèn)性的問(wèn)題。在javascript的類中,也有public成員和private成員之分,但究其細(xì)節(jié)卻不盡相同。javascript私有成員也是些在類外部不可以通過(guò)對(duì)象進(jìn)行操作的成員,其實(shí)在類的內(nèi)部成員之間私有成員也不定能被訪問(wèn)。在類的內(nèi)部一般只有私有成員和私有成員之間可以互相的訪問(wèn),你可以認(rèn)為其它成員權(quán)限不夠不能操作這些隱私的東西,但如果你有特權(quán),那就不一樣了,管它私有公開照用不誤。私有成員變量和普通變量聲明一樣,用var關(guān)鍵字,私有方法可以用var聲明變量來(lái)接收方法對(duì)象,也可以像普通方法那樣去構(gòu)建。
function Lady() {
var age = 30;
var name = "菜花";
var think = function() {
alert("其實(shí)我今年" + age + "歲。");
};
function fancy(){
alert("幻想變成20歲。");
};
this.Introduce = function() {
alert("我叫" + name + " , 今年20歲。");
};
};
var younglady = new Lady();
alert(younglady.age);//結(jié)果undefined
younglady.think(); //不支持
younglady.fancy(); //不支持
上面是一個(gè)Lady類,age、think、fancy都是私有成員,think和fancy方法可以訪問(wèn)age和name,think和fancy兩個(gè)方法也可以互相進(jìn)行調(diào)用。但它們是私有的,所以創(chuàng)建出來(lái)的youngLady對(duì)象并不能調(diào)用到age、think和fancy,當(dāng)然也不能調(diào)用到name。如果私有成員只能互相之間調(diào)用,其實(shí)也就失去了私有成員存在的意義。javascript提供特權(quán)成員可以建立外界和私有成員互通的橋梁。特權(quán)成員是公共成員的一種,公共成員有普通公共成員、特權(quán)成員和對(duì)象公共成員。
特權(quán)成員就是在類中用this.XX的方式建立的成員,它們可以通過(guò)對(duì)象來(lái)被調(diào)用,它們也可以訪問(wèn)私有成員,可以建立私有成員被訪問(wèn)的通道。
function Lady() {
var age = 30;
this.Name = "菜花";
var think = function() {
alert("其實(shí)我今年" + age + "歲。");
};
function fancy() {
alert("幻想變成20歲。");
};
this.Introduce = function() {
alert("我叫" + this.Name + " , 今年" + age + "歲。");
};
};
var younglady = new Lady();
younglady.Introduce(); //Introduce
普通公共成員的創(chuàng)建,不在類的里面來(lái)編碼,而是通過(guò)類的prototype來(lái)創(chuàng)建。添加普通公共成員都直接添加到類的prototype中,而prototype就是一個(gè)像JSON對(duì)象一樣的成員集對(duì)象。當(dāng)我們進(jìn)行對(duì)象創(chuàng)建時(shí),可以認(rèn)為會(huì)將類prototype中的成員整體copy入新的Object對(duì)象中。
var younglady = new Lady();
younglady.Introduce(); //Introduce
Lady.prototype.Hobby = "上網(wǎng)";
Lady.prototype.GetName = function() {
return this.Name;
};
var lady2 = new Lady();
alert(lady2.GetName());
alert(lady2.Hobby);
上面代碼通過(guò)prototype為L(zhǎng)ady類添加了普通公共成員GetName方法和Hobby屬性,因?yàn)槭枪渤蓡T,所以它們可以和原先定意在類中的特權(quán)成員進(jìn)行互相訪問(wèn)。因?yàn)楣渤蓡T可以互相訪問(wèn)。對(duì)上述代碼做些修改。如下。
var younglady = new Lady();
Lady.prototype.Hobby = "上網(wǎng)";
Lady.prototype.GetName = function() {
return this.Name;
};
alert(younglady.GetName());
alert(younglady.Hobby);
先創(chuàng)建出Lady對(duì)象,再修改類成員,先前創(chuàng)建好的對(duì)象也具有了新的成員。這就是prototype做為類原型所帶來(lái)的好處,這里簡(jiǎn)單理解,可以認(rèn)為prototype是類對(duì)象的模版,模版的修改會(huì)影響到所有該類對(duì)象。
在添加普通成員的時(shí)候也可以來(lái)個(gè)批量的添加,直接用一個(gè)新的JSON對(duì)象來(lái)賦給prototype就可以了。但是要注意,現(xiàn)在是將原先的prototype進(jìn)行了替換,在替換之前創(chuàng)建的對(duì)象引用的是舊的prototype對(duì)象,所以對(duì)prototype替換之前創(chuàng)建的對(duì)象不會(huì)有Hobby和GetName成員。
Lady.prototype = {
Hobby: "上網(wǎng)",
GetName: function() {
return this.Name;
}
};
var younglady = new Lady();
alert(younglady.GetName());
alert(younglady.Hobby);
除了在構(gòu)建類時(shí)可以添加公共成員,還可以對(duì)對(duì)象直接進(jìn)行成員操作。這在本小系列第二篇文章里有描述。這里做一下補(bǔ)充,對(duì)對(duì)象直接添加的成員,也是一種公共成員,這些成員也可以和類中原先具有的公共成員進(jìn)行訪問(wèn)。
younglady.SetName = function(name) {
this.Name = name;
};
younglady.SetName("菜明");
alert(younglady.GetName());
以上說(shuō)了一下類成員的東西,下次再說(shuō)說(shuō)類繼承相關(guān)的東西。(如有不當(dāng)說(shuō)法請(qǐng)指正)
相關(guān)文章
改變javascript函數(shù)內(nèi)部this指針指向的三種方法
javascript 的this 值,真的是非常的莫名奇妙。我一直被搞的很頭暈,也許正是這個(gè)this,讓大多數(shù)人感覺(jué)js 非常的莫名其妙。2010-04-04學(xué)習(xí)面向?qū)ο笾嫦驅(qū)ο蟮男g(shù)語(yǔ)
學(xué)習(xí)面向?qū)ο笾嫦驅(qū)ο蟮男g(shù)語(yǔ),學(xué)習(xí)面向?qū)ο笤O(shè)計(jì)的朋友可以參考下。2010-11-11javascript new fun的執(zhí)行過(guò)程
new fun的執(zhí)行過(guò)程分析,學(xué)習(xí)面向?qū)ο蟮呐笥芽梢詤⒖枷隆?/div> 2010-08-08JavaScript定義類或函數(shù)的幾種方式小結(jié)
js中不論是定義類或者函數(shù),很多朋友想將代碼寫的更專業(yè),更方便擴(kuò)展等,那么就可以參考這篇文章了,最好是總結(jié),建議大家收藏下。2011-01-01JavaScript對(duì)象鏈?zhǔn)讲僮鞔a(jquery)
自從使用了jQuery以后,對(duì)它的鏈?zhǔn)讲僮骱苁且蕾?,以至于常常覺(jué)得其他庫(kù)不好用。。2010-07-07

JavaScript 構(gòu)造函數(shù) 面相對(duì)象學(xué)習(xí)必備知識(shí)