转载:http://blog.csdn.net/lining213/article/details/6119442
<script>
var PersonPojo = function(){
// 定义私有域(即成员变量)
var name = "佚名" ; // 姓名
var age = 18 ; // 年龄
var sex = "男" ; // 性别
// 姓名取值方法
this.getName = function() {
return name;
};
// 姓名赋值方法
this.setName = function(n) {
name = n;
};
// 年龄取值方法
this.getAge = function () {
return age;
};
// 年龄赋值方法
this.setAge = function(a) {
age = a;
};
// 性别取值方法
this.getSex = function() {
return sex;
};
// 性别赋值方法
this.setSex = function(s) {
sex = s;
};
// 自我介绍的方法
this.selfIntro = function() {
alert("我是一个名字叫"
+ this.getName() + ",年龄为"
+ this.getAge() + "的"
+ this.getSex() + "人!");
};
}
/**
* 学员Pojo类(作为本演示中的派生类(或称子类)角色出场)
* 演示OOP在JavaScript中多态的书写方式
* By CodingMouse
*/
var StudentPojo = function(){
// 自我介绍的方法(覆盖父类PersonPojo的selfIntro方法)
this.selfIntro = function() {
alert("我是一个名字叫"
+ this.getName() + ",年龄为"
+ this.getAge() + "的"
+ this.getSex() + "学员!");
};
}
/**
* 教员Pojo类(作为本演示中的派生类(或称子类)角色出场)
* 演示OOP在JavaScript中多态的书写方式
* By CodingMouse
*/
var TeacherPojo = function() {
// 自我介绍的方法(覆盖父类PersonPojo的selfIntro方法)
this.selfIntro = function() {
// JavaScript中是使用arguments对象(可变参数,实现方法重载的关键点)来实现重
载机制的
alert("我是一个名字叫"
+ this.getName() + ",年龄为"
+ this.getAge() + "的"
+ this.getSex() + "教员"
+ (arguments.length == 1 ? (",主讲" + arguments[0] + "课程") : "")
+ "!");
};
}
/**
* 使用StudentPojo/TeacherPojo原型(prototype)方式呼叫PersonPojo出场,
* 通过指定prototype,你就可以在StudentPojo/TeacherPojo类中如同在Java中呼叫父
* 类的方式调用父类的公共域。此处可以理解为如同在Java中使用extends
* 关键字通知编译器StudentPojo/TeacherPojo类要继承PersonPojo类。
*/
StudentPojo.prototype = new PersonPojo();
TeacherPojo.prototype = new PersonPojo();
/**
* 关键点:打招呼的演示方法 - 利用多态特性呼叫自我介绍方法
*(演示多态,由子类去呼叫父类方法,父类方法自动调用被子类覆盖过的同名方法)
* 使用父类类型的引用指向子类的对象。
*/
function SayHello(intro) {
// 判断实参是否是PersonPojo的一个实例
if (intro instanceof PersonPojo) {
// 调用自我介绍方法(编译器会自动获取被覆盖过的子类方法并调用)
intro.selfIntro();
}
}
// 测试程序主方法
function main(){
// 创建一个学员实例并设置属性(演示方法覆盖/重写)
var stu = new StudentPojo();
stu.setName("张三");
stu.setAge(21);
stu.setSex("男");
// 创建一个教员实例并设置属性(演示方法覆盖/重写)
var tea = new TeacherPojo();
tea.setName("周七");
tea.setAge(26);
tea.setSex("女");
// 创建另一个教员实例并设置属性(演示方法重载)
var tea2 = new TeacherPojo();
tea2.setName("周七");
tea2.setAge(26);
tea2.setSex("女");
/**
* 关键点:利用多态特性呼叫自我介绍方法
*(演示多态,由子类去呼叫父类方法,父类方法自动调用被子类覆盖过的同名方法)
* 使用父类类型的引用指向子类的对象。
*/
SayHello(stu);
SayHello(tea);
tea2.selfIntro("Java"); // 演示方法重载
}
main();
</script>