call,apply,bind,这三个方法,其实只要会一个,就都会了,区别并不大

它们都是用来改变原本函数的this指向,和参数的方法

一.简单用法举例

function Animal(){
	this.name = '动物'
	this.tellName = function(food,food2){
    	console.log(`${this.name}想吃${food}和${food2}`)
    }
}

let cat = {
	name:'猫咪'
}

let dog = new Animal()
dog.tellName()	//动物想吃undefined和undefined

一.call


dog.tellName.call(cat,'鱼','小鱼干')	//猫咪想吃鱼和小鱼干

二.apply

dog.tellName.apply(cat,['鱼','小鱼干'])	//猫咪想吃鱼和小鱼干

三.bind

let fun =  dog.tellName.bind(cat,'鱼','小鱼干')	//它并不会立即执行,而是返回一个函数
fun()	//猫咪想吃鱼和小鱼干
fun()	//猫咪想吃鱼和小鱼干

总结:它们改变了原本函数的this指向,以第一个参数作为this指向

二.实践应用

可用于构造函数继承


function User(){
	this.login = function(){
    	console.log('登录')
    }
}

function Manage(){
	User.apply(this)	//执行了User,在里面代码执行前,把this的指向改变成了Manage,所以自然,this.login烙印在了Manage这个函数里面,成功的让Manage也拥有了login这个函数
}

let people = new Manage()

people.login()	//登录