借用构造函数继承
+ 继承 => 两个构造函数之间的关系
== 为了让子类的实例使用父类的属性和方法
+ 继承方案
== 在子类的构造函数体内,借用构造函数执行一下
== 并且强行让父类的构造函数的this指向子类的实例
借用构造函数继承的优缺点
+ 优点
1 继承来 的属性写在了自己的身上
== 就不需要去__proto__上找了
2 自己需要的两个属性的值,在一个构造函数的时候传递
== 不想原型继承需要在两个地方传递参数
+ 缺点
1 只能继承父类的属性
== 不能继承父类原型prototype上的方法
== 写在构造函数体内的都可以继承下来
call是改变函数内部this指向的方法之一
+ 调用是跟在函数后面的
+ fn() => fn.call()
+ obj.fn() => obj.fn.call()
+ 目的是强行改变本次调用的this指向
+ 不管你本身函数内部的this指向谁
+ 我让你本次指向谁就指向谁
+ 语法:函数名.call(你要改变的函数this指向,给函数传递的实参1,给函数传递的实参2,...)
特点: 将父类的构造函数当做普通函数来进行执行,使用call改变this的指向
优点: 可以将父类里面的属性继承一份,变成自己自己身上的属性
缺点: 不能继承父类里面的方法
// 1 准备一个父类
function Person(name,gender){
this.name = name;
this.gender = gender;
}
// 原型上添加一个方法
Person.prototype.sayHi = function(){
console.log('hi')
}
// 2 准备一个子类
function Student(age,name,gender){
// 构造函数里面的this是本次的实例对象
this.age = age;
// 此时Person作为普通函数调用,Person里面的this是window
// name属性和gender属性加在了window上
// 直接调用父类的构造函数无法实现继承
// Person(name,gender);
// 必须要调用Person的时候,让Person函数里面的this和Student里面的this是一样的,也就是实例对象
// 如何改变函数本地调用的this指向?
Person.call(this,name,gender)
// this.name = name;
// this.gender = gender;
// 上面的代码等价于
// Person.call(this,name,gender)
}
// 在同一个位置传递参数,只需要多写几个行参就可以
let s = new Student(18,'lucy','女');
/*
s = {
age:18,
name:'lucy',
gender:'女'
}
*/
console.log(s)