JavaScript面向对象之继承和多态
前言:我之前已经写过了javascript如何创建一个类似于java写法的类User,并且也写了一些类似的一些写法。
既然关注了面向对象的类,就无可避免地要提到面向对象的特性:封装,继承和多态。
封装:封装就像是一个类,它把对象类似于表格数据单元存储起来,对外只提供属性和方法。
继承:继承就是在类的基础之上加以扩展使现有的类属性更加全面,做的事情甚至更多(当然也可以完全不做任何修改,直接拿来使用)。
多态:动态的调用类型或接口方法,自动完成类型匹配。下面代码为证:
1、封装一个User类,作为基类
/**
*声明一个类似于java的类并添加其属性
*/
var User=function(){
var name='jack';//默认值
var gender=‘male’;//默认值
var age=20;//默认值
this.setName=function(name){
this.name=name;
};
this.getName=function(){
return this.name;
}
this.setGender=function(gender){
this.gender=gender;
};
this.getGender=function(){
return this.gender;
}
this.setAge=function(age){
this.age=age;
};
this.getAge=function(){
return this.age;
}
this.introduceMyself=function(){
alert('Hello!my name is '+this.getName()+",I'm "+this.getAge()+'years old!');
}
}
2、继承:创建User的子类
派生出子类Bluce并重写介绍自己的方法。
var Bluce=function(){
this.introduceMyself=function(){
alert('Bluce say hello to you!');
}
}
派生出子类Lisa并重写自己的介绍方法。
var Lisa=function(){
this.introduceMyself=function(){
alert('Lisa say hello to you!');
}
}
/**
*多态方法
*/
function sayHello(intro){
// 判断实参是否是User的一个实例
if (intro instanceof User) {
// 调用sayHello方法(编译器会自动获取被覆盖过的子类方法并调用)
intro.introduceMyself();
}
}
实现继承:
Bluce.prototype=new User();
Lisa.prototype=new User();
3、多态调用
var ub=new Bluce();
ub.setName("Bluce");
ub.setAge(23);
ub.setGender('male');
ub.sayHello(ub);
var ul=new Lisa();
ul.setName("Lisa");
ul.setAge(21);
ul.setGender('female');
ul.sayHello(ul);