继承
原型链
利用实例,原型对象,构造函数之间的关系实现继承
Truck.prototype=new Car();
重写方法就是继承之后,对原方法进行重新定义·
原型链的问题
1.A继承上面的构造函数后,它会默认所有的方法和函数都是A的,如果我们创建一个实例向属性中加入新的参数c,
后面的实例再调用都会输出c,改变了参数的值
2.不能通过子类型的实例向父类传参
借用构造函数
完美解决了原型链的问题
利用父类的call(),apply()方法
//call接受两个参数,一是函数运用的作用域,二是参数列表(要把参数列出来)
apply和它类似,但是接受的是参数数组
通过call和apply方法,既可以继承父类,也可以向父类传参
在使用call或者apply方法时,相当于有父类的副本,当创建子类实例时,只是在调试它的参数,
并不会改变父类的参数,那么后面的实例再继承时,就不会输出前面实例加入的参数了
Car.call(this,brand,color);
弊端就是,在构造函数里面写方法,方法失去复用性
组合继承
一般使用组合继承
结合原型链和借用构造函数的优点
继承属性用借用构造函数 (属性写在构造函数里面)
继承方法用原型链 (方法用原型对象的方式加入)
<div id="put" ></div>
<script>
function Car(brand,color){
this.brand=brand;
this.color=color;
}
Car.prototype.getbrand=function(){
return this.brand;
}
Car.prototype.getcolor=function(){
return this.color;
}
function Truck(brand,color,place){//传参,
Car.call(this,brand,color);//继承属性 解决使用原型链时属性被更改的问题
this.place=place;
}
Truck.prototype=new Car();//继承方法 解决使用借用构造函数时方法复用性不好的问题
Truck.prototype.getplace=function(){
return this.place;
}
var truck1=new Truck("奥迪a6","白色","德国");
document.getElementById("put").innerText="品牌:"+truck1.getbrand()+"\n"+"颜色:"+truck1.getcolor()+"\n"+"产地:"+truck1.getplace();
</script>