关于继承
组合继承:构造函数+原型对象模拟实现继承
call()
调用这个函数,并且修改函数运行的时this指向
fun.call(thisArg,arg1,arg2,…)
- thisArg:当前调用函数this的指向对象
- arg1,arg2:传递的其它参数
function fn(x,y){
console.log('我要早起‘);
}
var 0={
name:'andy'
};
//1.call()可以调用函数
fn.call();
//2.call ()可以改变这个函数的this指向
fn.call(o,1,2);
借用父构造函数继承属性
functon Father(uname,age,){
//this指向父构造函数的对象实例
this.uname=uname;
this.age=age;
}
function Son(uname,age,score){
//this指向子构造函数的对象实例
Father.call(this,uname,age,);
this.score=score;(儿子也可以有自己的想法)
}
var son=new Son('小楠楠’,20,100);
console.log(son);
Father.call调用父构造函数,同时要让父构造函数中的this指向我们的子构造函数(因为这句代码写在子构造函数里面,子构造函数里的this就指向子构造函数里面的实例),加入属性就可以使用。
利用原型对象继承方法
functon Father(uname,age,){
//this指向父构造函数的对象实例
this.uname=uname;
this.age=age;
}
Father.prototype.money=function(){
console.log('100');
};
function Son(uname,age,score){
//this指向子构造函数的对象实例
Father.call(this,uname,age,);
this.score=score;(儿子也可以有自己的想法)
}
var son=new Son('小楠楠’,20,100);
console.log(son);
我们给父构造函数写了一个方法,但是这个方法保存在原型对象中,所以子构造函数不能调用这个方法。
在这里我们也不能在子构造函数中添加Son.prototype=Father.prototype
这样我们的子构造函数虽然可以获得父构造函数的方法,但是Son原型对象也指向了Father原型对象,会将其覆盖掉,假如儿子要考试,则父亲也要考试,就是修改了子原型对象的话,父原型对象也会跟着一起变化。
子构造函数的专门方法
Son.prototype.constructor=Son;
Son.prototype=new Father();
这里需要注意的是,new Father是一个实例对象,它会覆盖掉原来原来的Son prototype,此时的Son prototype里面没有constructor了,这里需要给它指回去。
如果利用对象的形式来修改原型对象,要利用constructor指回原来的构造函数。