您的位置:首页 > Web前端 > JavaScript

模拟Javascript面向对象的多态特性

2016-12-12 14:26 501 查看
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解释执行的特性,因此可以在基类中调用将要在派生类中定义的方法,那么这个基类方法就相当于虚方法,可以实现模拟多态!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: