Javascript面向對象特性

      Javascript出現也不是一天兩天了,但近些年之前,一直都只是做一做表單驗證,加點花哨的網頁特效什麼的,頂多算得網頁設計的調料 。但是隨着應用系統向着網絡延伸,Javascript在系統應用中扮演着越來越重要的角色,Jquery、Ext、Dojo等Ajxa框架層出不窮。每一個在瀏覽器上做開發的程序員都有必要了解一下Javascript語言!

     與C++等語言不同的是,Javascript是一種弱類型語言,只有字符串、數值等幾種基本的數據類型,並且可以隨意轉換,由瀏覽器動態解釋執行,這種特性一方面爲開發提供了更多的靈活性,另一方面也增加了開發的複雜性!

     Javascript是一種基於對象的語言,而不是面向對象的語言。Javascript語言本身定義了字符、數組、日期等一系列對象。在任何地方都可以使用這些對象,但是卻沒有class關鍵字,不能定義自己的類和對象。Javascript代碼只有以面向過程的方式開發,當代碼數量級增大的時候,幾乎無法控制所有Javascript代碼!但是Javascript是極其靈活的語言,它內部的原生對象鏈特性提供了足夠的靈活度讓我們可以模擬出面向對象的特性,抽象、封裝、繼承、多態,一個也不少!

      首先是一個普通的Javascript方法:

function HelloWorld(){return “HelloWorld”;}//定義一個方法   
HelloWorld();//調用這個方法

其實上面的代碼就已經創建了一個類HelloWorld,然後又創建了這個類的對象,爲了讓它看起來更像類和對象,可以把上面的代碼改造一下:

function MyClass(){return this;}//定義一個類   
var Obj = new MyClass();//實例化對象

 

 

相同的語法,換一種寫法就會發現利用function關鍵字就可以定義一個類,用對function的調用級可實例化自定義類的對象!既然是類,就應該具備封裝性,那麼公有屬性、公有方法、私有屬性、私有方法、構造函數是什麼樣的呢?

function calculator(a,b){//定義一個類   
this.PI=3.14; //公有屬性
this.Text="計算器"; //公有屬性
this.A; //公有屬性
this.B; //公有屬性
var m_me=this; //私有屬性
var m_Remark="calculator";//私有屬性
this.Add=function(){ //公有方法
//公有方法可以調用其它公有屬性或方法
return this.A+this.B;
}
this.Sub=function(){ //公有方法
return m_me.SubNum(this.A,this.B);
}
var SubNum=function(a,b){//私有方法
return a-b;
}
var AddNum=function(){//私有方法
//私有方法可以調用私有屬性或方法
var X=SubNum(9,6);
/*私有方法不能直接調用公有方法,
爲了調用公有方法,則可以使用m_me這個指向類本身的 私有屬性即可*/

return m_me.Add();
}
/*其它未封裝在公有方法和私有方法中的代碼,即爲構造函數的 代碼,構造代碼既可調用公有方法也可調用私有方法,不受限制*/
var TestValue=SubNum(6,5);

var Obj = new calculator(100,50);//實例化對象
var X = Obj.Add(); //調用公有方法
var Y = Obj.PI; //調用公有屬性
Obj.A=200;
Obj.B=150;
var Z=Obj.Sub();

      由this定義的屬性或方法就是公有屬性或方法,由var定義的屬性或方法就是私有方法,不屬於私有方法或屬性的代碼即爲構造代碼!構造代碼將會在對象實例化的時候被執行,而公有和私有方法內定義的代碼只有在被調用的時候纔會被執行!

     構造代碼可以訪問公有和私有方法或屬性,公有方法也可以訪問公有和私有方法或屬性,但是與其它語言不同的是,Javascript定義的類中,私有方法有獨立的作用域,無法通過this關鍵字訪問類,因此也無法直接訪問公有方法或屬性,只可以訪問私有方法或屬性,爲了在私有方法中訪問公有方法或屬性,可以定義私有屬性var m_me=this;然後通過這個私有屬性,間接的訪問公有方法或屬性!

     到此,封裝性就差不多了,但是Javascript是動態解釋執行的,因此可以在運行中動態的爲對象添加屬性或方法(公有):

function calculator(){//定義一個類
this.A=1; //定義公有屬性
this.Add=function(){ //定義公有方法Add
return this.A++;
}
}
var Obj = new calculator(); //實例化對象
Obj.Add(); //調用公有方法Add
Obj.Sub=function(){ //爲Obj對象添加公有方法Sub
return 9-6;
}
var X = Obj.Sub(); //調用公有方法Sub
calculator.prototype.SubNum=function(){//爲calculator類定義公有方法SubNum
return 100-50;
}
var Y = Obj.SubNum(); //調用公有方法SubNum

 

      可以直接爲對象動態添加屬性和方法,也可以用prototype關鍵字爲類添加公有方法,所有的對象都會包含類中新添加的屬性方法,因此可以利用此特性擴展Javascript語言內嵌的對象:

String.prototype.trim = function(){//去掉首尾空格
return this.replace(/(^/s*)|(/s*$)/g,"");//將字符串前後空格,用空字符串替代。
}
var Text = " Text Text ";
var NewText = Text.trim();//去掉前後空格

   既然可以在類的不同地方或對象上定義屬性或方法,那麼,如果這些屬性或方法同名的話,哪些方法會被隱藏呢?以下是測試代碼:

<html>
<head></head>
<body>
<script language="Javascript">
function MyClass(){//定義一個類
	this.Hello=function(){	//定義公有方法Hello
		return "Hello A";
	}
}
var Obj = new MyClass();	
var X = Obj.Hello();		
alert(X);			//結果:Hello A
Obj.Hello=function(){
		return "Hello B";
	}
var Y = Obj.Hello();
alert(Y);			//結果:Hello B
MyClass.prototype.Hello=function(){//
	return  "Hello C";
}
var Z = Obj.Hello();		
alert(Z);			//結果:Hello B

Obj.Say=function(){	//
		return "Say B";
	}
var YY = Obj.Say();
alert(YY);			//結果:Say B
MyClass.prototype.Say=function(){
	return  "Say C";
}
var ZZ = Obj.Say();
alert(ZZ);			//結果:Say B

var Obj2= new MyClass();
var K = Obj2.Hello();
alert(K);			//結果:Hello A
var KK = Obj2.Say();
alert(KK);			//結果:Say C
</script>
</body>
</html>

  通過以上測試,就可以看出,爲對象添加的屬性只會添加在對象本身上,而不會增加到類中;在類的prototype中增加了方法,則所有的對象都增加了此方法!

當以不同的方式爲類或對象增加了同名的方法或屬性,那麼只有一個方法可見,其它方法將被隱藏!可訪問性由高到低依次爲:對象定義的方法>直接在類中定義的方法>通過prototype爲類定義的方法

     這裏再提一下靜態方法,Javascript也可以有靜態方法,一切皆是對象,類也是對象,因此也可以爲“類”這個對象添加方法屬性,實現類的靜態方法:

function MyClass(){//定義一個類
this.Add=function(a,b){ //定義公有方法Add
return a+b;
}
}
MyClass.sub=function(a,b){//添加一個靜態方法
return a-b;
}
var X = MyClass.sub(100,50);//使用類名直接調用靜態方法

     一般的語言都首先定義類,然後實例化類生成對象,Javascript也是如此,但是除此之外還可以直接定義對象:

var MyObj ={
this.Text:"我的對象",
this.Hello:function(){
return "Hello";
}
}

    使用Json格式即可直接定義對象,因爲Json格式就是解釋器使用的內部格式。

   到此爲止,Javascript類的封裝性就差不多了,以後再說一說Javascript類的多態與繼承性!

發佈了34 篇原創文章 · 獲贊 1 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章