面象對象編程技術(shù)的核心理念:封裝、繼承、多態(tài);在一些主流的高級編程語言中,比 如:C#,VB.NET,JAVA,PHP等都是很容易實(shí)現(xiàn)的,而如果要在javascript中實(shí)現(xiàn)面象對象編程,可就不那么直接和容易了,因?yàn)?javascript并不是面向?qū)ο蟮恼Z言,所以我們只能通過javascript的一些特性,比如:閉包、原型鏈等來模擬出面向?qū)ο缶幊?,我認(rèn)為這些是 作為熟練掌握與靈活運(yùn)用javascript的基礎(chǔ),園子里已有很多的javascript高手對于這方面都有介紹與分析,而我僅以作為一個項(xiàng)目負(fù)責(zé)人 (獨(dú)立設(shè)計(jì)與開發(fā)WEB前端與后端)的視角來重新理解javascript面向?qū)?/div>
面象對象編程技術(shù)的核心理念:封裝、繼承、多態(tài);在一些主流的高級編程語言中,比 如:C#,VB.NET,JAVA,PHP等都是很容易實(shí)現(xiàn)的,而如果要在javascript中實(shí)現(xiàn)面象對象編程,可就不那么直接和容易了,因?yàn)?javascript并不是面向?qū)ο蟮恼Z言,所以我們只能通過javascript的一些特性,比如:閉包、原型鏈等來模擬出面向?qū)ο缶幊?,我認(rèn)為這些是 作為熟練掌握與靈活運(yùn)用javascript的基礎(chǔ),園子里已有很多的javascript高手對于這方面都有介紹與分析,而我僅以作為一個項(xiàng)目負(fù)責(zé)人 (獨(dú)立設(shè)計(jì)與開發(fā)WEB前端與后端)的視角來重新理解javascript面向?qū)ο笠c(diǎn)。

既然是面向?qū)ο螅紫任覀円廊绾蝿?chuàng)建一個對象,以下列出了創(chuàng)建對象的幾種常見方法:
A.直接創(chuàng)建一個對象實(shí)例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var Person1 = { Name: "夢在旅途" , Age: 29, Sex: "男" , Height: 178 };
alert(Person1.Name);
var Person2 = new Object();
Person2.Name = "夢在旅途" ;
Person2.Age = 29;
Person2.Sex = "男" ;
Person2.Height = 178;
alert(Person2.Name);
var Person3 = new Object({ Name: "夢在旅途" , Age: 29, Sex: "男" , Height: 178 });
alert(Person3.Name);
|
優(yōu)點(diǎn):直接創(chuàng)建一個對象,無需提前定義類型;
缺點(diǎn):無法實(shí)現(xiàn)復(fù)用;
B.先定義后實(shí)例化對象:
1
2
3
4
5
6
7
8
9
10
|
function Person4(n,a,s,h) {
this .Name = n;
this .Age = a;
this .Sex = s;
this .Height = h;
}
var p4 = new Person4( "夢在旅途" , 29, "男" , 178);
alert(p4.Age);
|
優(yōu)點(diǎn):類似面向?qū)ο缶幊陶Z言的構(gòu)造函數(shù),容易理解,且定義后可通過new關(guān)鍵字實(shí)例化多個對象,實(shí)現(xiàn)復(fù)用。
缺點(diǎn):需先定義后才能實(shí)例化;
綜上所述,建議采用B方法來創(chuàng)建對象。
實(shí)現(xiàn)封裝,即只暴露公共方法與公共屬性,隱藏實(shí)現(xiàn)細(xì)節(jié)(私有方法、屬性)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
function Person5(n, a, s, h) {
this .Name = n;
this .Age = a;
this .Sex = s;
this .Height = h;
this .AfterYear = function (count) {
updateAge(count);
alert(_currentYear + "后,我已經(jīng):" + this .Age + "歲了!" );
};
this .Say = function () {
alert( "我的個人信息--> Name: " + this .Name+ ", Age: " + this .Age + ", Sex: " + this .Sex + ", Height:" + this .Height);
}
var _self = this ;
var _currentYear = 2015;
function updateAge(count) {
_currentYear += count;
_self.Age += count;
};
}
var p5 = new Person5( "夢在旅途" , 29, "男" , 178);
p5.AfterYear(10);
p5.AfterYear(25);
|
利用原型鏈實(shí)現(xiàn)繼承,即一個對象包含另一個對象的所有公共屬性與方法,實(shí)現(xiàn)繼承的方法有很多,我覺得采用如下形式來模擬繼承更符合面向?qū)ο蟮乃季S:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function SoftEngineer(n, a, s, h, lang) {
Person5.call( this , n, a, s, h);
this .Lang = lang;
this .SayCode = function () {
alert( "我是一名軟件工程師,我會" + this .Lang + "編程語言!" );
}
this .Working = function () { };
}
SoftEngineer.prototype = new Person5();
var softengr = new SoftEngineer( "夢在旅途" , 29, "男" , 178, "javascript" );
softengr.Say();
softengr.SayCode();
|
利用原型鏈實(shí)現(xiàn)多態(tài),即基于同一個方法簽名在不同的子類中表現(xiàn)的形式不同:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
function WebSoftEngineer(n, a, s, h, lang) {
SoftEngineer.apply( this , [n, a, s, h, lang]);
this .Working = function () {
alert( "我是網(wǎng)頁工程師,從事網(wǎng)頁開發(fā)設(shè)計(jì)工作!" );
};
};
WebSoftEngineer.prototype = new SoftEngineer();
function AppSoftEngineer(n, a, s, h, lang) {
SoftEngineer.apply( this , [n, a, s, h, lang]);
this .Working = function () {
alert( "我是應(yīng)用工程師,從事客戶端應(yīng)用程序開發(fā)設(shè)計(jì)工作!" );
};
};
AppSoftEngineer.prototype = new SoftEngineer();
var webengr = new WebSoftEngineer( "夢在旅途" , 29, "男" , 178, "javascript" );
webengr.Say();
webengr.Working();
var appengr = new AppSoftEngineer( "夢在旅途" , 29, "男" , 178, "c#" );
appengr.Say();
appengr.Working();
|