JS中的继承和我们现实当中的继承类似,就是子类(继承者)拥有父类(被继承者)的所有特性(属性与方法),同时子类又可以拥有自己特定的属性或方法(基因突变),而且子类的改变不会影响到父类。我们为什么要继承呢?其实主要是为了代码复用。
继承分两个部分,第一是属性的继承,第二是方法的继承。
我们先创造一个简单的父类:
function CreatePerson(name,sex){ //父类
this.name = name;
this.sex = sex;
}
这个父类有两个属性name和sex。
我们再往这个父类身上添加一些功能(方法):
CreatePerson.prototype.showName = function(){
alert( this.name );
};
这个父类就有了showName这个方法,然后我们就去实例化它:
var p1 = new CreatePerson('小明','男');
我们可以在Chrome的控制台那里打印一下p1这个对象,看看它有什么:
接下来,我们定义一个子类,这个子类继承CreatePerson。
function CreateStar(name,sex,job){ //子类
CreatePerson.call(this,name,sex);
this.job = job;
}
我们通过在子类内部调用父类CreatePerson的构造函数,利用call改变this指向,使子类拥有了父类的所有属性(属性继承)。这个子类也有自己独特的属性job(基因突变)。
这个子类CreateStar继承了父类CreatePerson的属性后就要继承父类的方法了,这里我们用拷贝继承的编程技术,因为直接把父类的原型对象赋给子类的原型对象(CreateStar.prototype = CreatePerson.prototype)会造成对象间的引用,这不符合继承的定义,因为对象间的引用会使得子类的改变影响到父类,就是父类会随着子类的改变而改变,这就麻烦了。
定义一个继承的方法:
/**
1. 子类继承父类函数的方法
2. @param obj1 子类
3. @param obj2 父类
*/
function extend(obj1,obj2){
for(var attr in obj2){
obj1[attr] = obj2[attr];
}
}
子类CreateStar要继承父类CreatePerson的方法,只要直接调用extend这个方法就可以了。
extend( CreateStar.prototype , CreatePerson.prototype );
我们再定义子类CreateStar特有的方法:
CreateStar.prototype.showJob = function(){
};
这样,子类拥有了showJob方法后就不会因为对象间的引用的原因,使得父类也有showJob方法了。
我们实例化一下这个子类:
var p2 = new CreateStar('刘德华','男','演员');
此时,我们可以在Chrome的控制台那里打印一下p1和p2这个两个对象,看看它们的区别:
总结:
1. 继承的定义
2. 属性继承与方法继承
3. 拷贝继承extend方法