继承
ES6之前没有extends继承。我们可以用构造函数加原型对象模拟实现继承,称为组合继承
call()
fun.call(thisarg,arg1,arg2,…)
thisArg:当前调用this的指向对象
功能:
1.调用函数
2.改变函数指向
输出andy
<script>
function fn(x,y){
console.log('hhh');
//正常指向window
console.log(this);
console.log(x+y);
}
var o={
name='andy';
}
//1.调用函数
fn.call();
//2.改变函数指向
//第一个o不会当做参数传输。
fn.call(o,1,2);
</script>
子构造函数用父构造函数
父亲this指向子类this或理解为call()传进this,把父类构造函数拿过来。
指回:从左向右看,约等于链表。
1.指向子构造函数实例
2.先用call调用方法,然后把子this传进来
3.改为指向子类实例
输出子类构造函数
<script>
//父构造函数
function father(name,age){
//指向父构造函数实例
this.name=name;
this.age=age;
}
function son(name,age){
//指向子构造函数实例
//先用call调用方法,然后把子this传进来
//改为指向子类实例
father.call(this,name,age);
}
</script>
子类继承父类方法
son.prototype=father.prototype;
会有问题吗。
有问题:子类指向父类原型对象,**父类地址给了孩子。**这样父类有了子类的原型对象方法。子原型对象变化了,父类也会变化。约等于双方方法互通了。
解决方法
new一个father的实例对象。
父类实例通过_proto_指向father原型对象
这样son的_proto_拥有父类原型对象方法
var father.baba=new father();
son.prototype=baba.prototype;
问题:这样做缺点?
son的prototype的构造函数指向了父类,需要用constructor重新指回原来的构造函数。
指向、指回:从左向右看,约等于链表。
son.prototype.constructor=son;
总结:传递的是地址。