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解釋執行的特性,因此可以再基類中調用將要在派生類中定義的方法,那麼這個基類方法就相當於虛方法,可以實現模擬多態!