浅谈 js 继承实现
为什么需要js继承
主要是为了减少代码的冗余量。下面用例子来说明。
假设我们需要2个类,一个小学生(Purpil), 一个中学生(MidStudent), 他们各自的属性和方法如下
//小学生
function Purpil(name, age) {
this.name = name;
this.age = age;
this.show = function() {
window.alert(this.name + " " + this.age);
}
this.cost = function(money) {
window.alert("应缴费用:" + money * 0.6);
}
}
//中学生
function MidStudent(name, age) {
this.name = name;
this.age = age;
this.show = function() {
window.alert(this.name + " " + this.age);
}
this.cost = function(money) {
window.alert("应缴费用:" + money * 0.9);
}
}
对比上面的代码可以看出,只有cost方法中的应缴汇率,二者是不同的,而属性(姓名,年龄)及show方法,则是完全相同的,这就造成了代码的冗余,为了解决这个问题,我们需要引入继承。
接下啦我们一起看看继承的几种方式
js继承方式
1.对象冒充
//首先我们新建一个具有学生共同属性和方法的类 Student
//将中学生和小学生共通的属性及方法提炼出来
function Student(name,age) {
this.name = name;
this.age = age;
this.show = function() {
window.alert(this.name + " " + this.age);
}
}
// 对象冒充
function Purpil(name,age) {
// 声明一个变量,让其指向具有共同属性和方法的类(Student)
this.stu = Student;
// 执行Student类的构造方法,这句话必须要执行,原因是js是动态编译语言
// 只有执行了这个方法才会声明属性、方法,否则的话执行时会报错
this.stu(name,age);
}
var purpil = new Purpil('小明',30);
purpil.show();
2.通过原型对象链的方法
这种方法是在最近所做项目(对日项目,而且系统比较老)的代码中出现比较多。
// 学生类的定义和上述1是相同的
function Student(name,age) {
this.name = name;
this.age = age;
this.show = function() {
window.alert(this.name + " " + this.age);
}
}
// 原型链
function Purpil(name,age) {
// 将参数传递给父类
this.__proto__.name = name;
this.__proto__.age = age;
// 小学生特有的方法
this.cost = function(money) {
window.alert("应缴费用:" + money * 0.6);
}
}
// 这是原型链方法实现的核心,将他的原型对象(可以理解成父类)指向Student
// Purpil.prototype中定义的属性和方法可以被Purpil的每个实例所引用
Purpil.prototype = new Student();
var purpil = new Purpil('小明',30);
purpil.show();
purpil.cost(2000);