js里面的继承(继承的是对象,对象的三大特征:封装、继承、多态)
要实现继承,必须有一个父类对象如下:
//先定义一个父类对象
function Animal(){
this.name=null;
this.animalcolor=null;
this.sex=null;
this.age=null;
this.type=null;
this.sleep=function(){
return this.name+"会睡觉";
}
}
//原型一个方法
Animal.prototype.eat=function(food){
return this.name+food;
}
1.原型链继承
原型链继承原理:将父类的实例作为子类的原型继承。
//定义一个子类对象
function Cat(){
this.solomouse=function(){
return this.name+"抓老鼠";
}
}
var a=new Animal();//实例对象
Cat.prototype=a;
Cat.prototype.speed=function(){
return 4.0;
}
//实例化Cat对象
var c=new Cat();
c.name="小花";
c.type="猫科";
c.AnimalColor="白黑";
c.age="2";
c.sex="母";
//!非常纯粹的继承关系,实例是子类的实例,也是父类的实例
//!父类新增原型方法/原型属性,子类都能访问到
2.构造继承
//原理:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(未用到原型)
//定义一个子类对象
function Cat(name,color,sex,age,type){
/* call apply 在args上有区别call 序列传参 apply 为数组传参*/
Animal.call(this,name,color,sex,age,type);
/*Animal.apply(this,[1,2,3,4,5]);*/
}
var c=new Cat("小猫","白色","母",2,"猫");
//实例只是子类的实例,不是父类的实例。
//只能继承父类的实例属性和方法,不能继承父类的原型属性和方法。
3.组合继承
function rou(){
this.eat=function (){
return "吃肉";
}
}
//定义一个子类对象
function Cat(){
Animal.call(this);
rou.call(this);
}
Cat.prototype=new Animal();
//两次调用父类构造函数:(第一次是在创建子类原型的时候,第二次是在子类构造函数内部)
//从而造成子类继承父类的属性,一组在子类实例上,一组在子类原型上(即在子类原型上创建不必要的多余的属性)