javascript 面向對象編程基礎 多態
2024-05-06 14:14:20
供稿:網友
Javascript已經可以模擬出面向對象的封裝和繼承特性,但是不幸的是Javascript對多態特性的支持非常弱!其它面向對象語言的多態一般都由方法重載和虛方法來實現多態,Javascript也通過這兩種途徑來實現!
重載:由于Javascript是弱類型的語言,而且又支持可變參數,當我們定義重載方法的時候,解釋器無法通過參數類型和參數個數來區分不同的重載方法,因此方法重載是不被支持的!當先后定義了同名的方法的時候,后定義的方法會覆蓋先定義的方法!
既然解釋器無法分辨重載方法,那就手動區分不同的方法:
代碼如下:
var MyClass=function(){
var AddNum=function(a,b){
return a+b;
}
var AddString=function(a,b){
return "I am here"+a+b;
}
this.Add=function(a,b){
if(typeof(a)=="number")
return AddNum(a,b);
else
return AddString(a,b);
}
}
var MyObj = new MyClass();
var X = MyObj.Add(5,6);
var Y = MyObj.Add("A","FFFFFF");
alert(X); //結果:11
alert(Y); //結果:I am hereAFFFFFF
虛方法:
代碼如下:
function BaseClass(){
this.Hello=function(){
return this.Say();
}
}
function MyClassA(){
this.Say=function(){
return "Hello";
}
}
function MyClassB(){
this.Say=function(){
return "This is MyClassB";
}
}
MyClassA.prototype = new BaseClass();
MyClassB.prototype = new BaseClass();
var ObjA = new MyClassA();
var XX = ObjA.Hello();
alert(XX); //結果:Hello
var ObjB = new MyClassB();
var YY = ObjB.Hello();
alert(YY); //結果:This is MyClassB
由于Javascript解釋執行的特性,因此可以再基類中調用將要在派生類中定義的方法,那么這個基類方法就相當于虛方法,可以實現模擬多態!
js的重載和重寫(覆寫):
重載的意思是,“同一個名字的函數(注意這里包括函數)或方法可以有多個實現,它們依靠參數的類型和(或)參數的個數來區分識別”。而重寫(覆蓋)的意思是,“子類中可以定義與父類中同名,并且參數類型和個數也相同的方法,這些方法的定義后,在子類的實例化對象中,父類中繼承的這些同名方法將被隱藏”。重載的英文是overload,覆蓋的英文是override。好了,概念介紹到這里,你猜到我要說什么了嗎?嘿嘿,Code is cheap.看重載代碼:
代碼如下:
// 通過函數的arguments屬性實現重載
function add() {
var sum = 0 ;
for ( var i = 0 ; i < arguments.length; i ++ ) {
sum += arguments[i];
}
return sum;
}
function test() {
alert(add());
alert(add( 1 , 2 ));
alert(add( 1 , 2 , 3 ));
}
通過代碼運行結果,這樣就實現了任意多個參數加法函數的重載了。當然,你還可以在函數中通過 instanceof 或者 constructor 來判斷每個參數的類型,來決定后面執行什么操作,實現更為復雜的函數或方法重載??傊?,javascript 的重載,是在函數中由用戶自己通過操作 arguments 這個屬性來實現的。關于arguments的特性,前面我已經做了簡單介紹,參考拙文:http://blog.csdn.net/zhanglingdll_39/archive/2009/08/20/4465670.aspx 。