要学js的继承,首先要知道什么是继承?要继承什么?如何继承?下面我就这几个问题进行一下归纳,希望能帮到一些人!
首先要知道,继承是对象的特征,继承的也是对象。而且如果要继承,首先得有一个父类对象,然后再定义一个子类对象来继承父类对象的属性和行为。
定义一个父类:
原形链继承(追加):给原型方法中追加属性和行为,使用prototype
如:给动物类中添加一个吃的属性,写法如下:
Animal.prototype.eat=function(){
return this.name+“会吃饭”;
};
**
几种继承的方式:
**
1.原型链继承:
原理:将父类的实例作为子类的原型继承
定义一个子类对象:
function Cat(){
this.catchmouse=function(){
return this.name+"会抓老鼠";
}
}
var a=new Animal(); //实例对象
Cat.prototype=a; //把a 整个对象赋给Cat,拥有animal对象的所有属性和行为
var c= new Cat(); //实例化Cat对象
这样就完成了原形链的继承,现在c已经继承了animal的所有属性和行为
console.log( c); //输出为cat对象,继承了animal;
特点:非常纯粹的继承关系,实例是子类的实例,也是父类的实例,父类新增原型方法或原型属性,子类都能访问到
console.log(c instanceof Cat); //true
console.log(c instanceof Animal); //true
说明:子类对象既是当前的类对象,也是父类的类对象
缺点:
(1)要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中无法实现多继承
(2)创建子类实例时,无法向父类构造函数传参
2.构造继承
原理:父类的实例复制给子类(没用到原型)
定义的另一个父类:
function eatmeat(name){
this.name=name;
this.eating=function (){
return this.name+"吃肉";
}
}
定义一个子类对象:
function Cat(name,sex,age,color,type){
Animal.apply(this,[name,sex,age,color,type]);
eatmeat.apply(this,[name]); //继承吃肉类(多继承)
}
var c=new Cat("小猫","白色","母",2,"猫科");
说明:上面代码中的Animal.apply(this)表示用Cat去替换Animal里的对象,后面是传的参数,也可以使用call()代替apply(),二者在替换对象时无区别,在参数(args上有区别)call为序列传参, apply是数组传参。
console.log(c instanceof Cat); // true
console.log(c instanceof Animal); //false
注:子类对象只能是当前类的构造函数,不能是父类的
构造继承的特点:
(1)创建子类实例时,可以向父类传参
(2)可以实现多继承
缺点:
(1)实例只是子类的实例,并不是父类的实例
(2)只能继承父类的实例和方法,不能继承原型链的实例和方法
3.实例继承
定义子类对象:
function Cat(){
var a=new Animal();
a.name="小猫";
return a;
}
可以直接在子类对象中赋值
调用时:可直接调用子类对象的方法:Cat();
也可以 var c=new Cat();
console.log(c instanceof Cat); //fals
console.log(c instanceof Animal); //true
特点:不限制调用方式,不管是new子类() , 还是直接调用子类(),返回的对象具有相同的效果。
缺点:
(1)实例是父类的实例,不是子类的实例
(2)不支持多继承
4.组合继承
实质是构造继承和原形链继承的共同使用,将构造继承和原型链的优点相结合,消除了两者的缺点。