2.继承
ES6之前并没有提供extends继承,我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。
2.1 call()
调用这个函数,并且修改函数运行时的this指向
fun.call(thisArg,arg1,arg2....);
- thisArg:当前调用函数this的指向对象
- arg1,arg2:传递的其他参数
function fn() {
console.log('hhh');
}
var a = {
name:'yph';
}
//call调用这个函数
fn.call();
//call可以改变这个函数的this指向 此时这个函数的this就指向o这个对象
fn.call(o);
2.2借用构造函数继承父类型的属性
核心原理:通过call()把父类型this指向子类型的this,这样就可以实现子类型继承父类型的属性。
function Father(name,age){
//this指向父构造函数的实例对象
this.name = name;
this.age = age;
}unction Son(name,age,score){
//this指向子构造函数的实例对象
Father.call(this,name,age);
this.score = score;
}
var son = new Son('hhh',20,90);
console.log(son);
2.3借用原型对象继承父类型的方法
function Father(name,age){
//this指向父构造函数的实例对象
this.name = name;
this.age = age;
}
Father.prototype.money = function(){
console.log(20000);
}
//这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会发生变化
//Son.prototype = Father.prototype;
//如果利用对象的形式修改了原型对象,别忘了利用constructor指回原来的构造函数
Son.prototype = new Father();
Son.prototype.constructor = Son;
function Son(name,age,score){
//this指向子构造函数的实例对象
Father.call(this,name,age);
this.score = score;
}
son.prototype = new Father();
var son = new Son('hhh',20,90);
console.log(son);
console.log(Father.prototype);
console.log(Son.prototype.constructor);