背景:ES6之前并没有给我们提供extends继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承.
一、函数call()
调用这个函数,并且修改函数运行时的this指向
fun.call(thisArg,arg1,arg2,...)
thisArg:当前调用函数this的指向对象
arg1,arg2:传递的其他参数
第一个作用:可以直接调用函数fun.call()
第二个作用:修改this的指向
// fun.call(o);
二、借用构造函数继承父类型属性
// 借用父构造函数继承属性
// 1.父构造函数
function Father(uname,age){
// this 指向父构造函数的对象实例
this.uname = uname;
this.age = age;
}
// 2.子构造函数
function Son(uname,age,score){
// this 指向子构造函数的对象实例
Father.call(this,uname,age);
this.score = score;
}
var son = new Son('刘德华',10,100);
console.log(son)
子构造函数如何继承父构造函数的原型链上的公共方法呢?(组合继承)
Father.prototype.money = function(){
console.log(100000);
}
// 通过创建一个新的内存空间并指向到Son的原型对象即可 (新的父构造函数实例对象不会占用原先的父构造函数的同一内存的空间,而是新开辟一个内存空间
Son.prototype = new Father();
// 但是new Father() 是一个对象{},对象会覆盖子构造函数的原先的原形对象,需要指回原先的Son
Son.prototype.constructor = Son;
注:如此绑定了之后,如果son实例和son的原型链上无money()这个方法的话,会依次一直往上面的原型链去找,直至找到这个方法。