call,apply,bind改变this指向
案例:
龙龙的某云音乐自动续费某胶vip,在某云上听了许多vip专属音乐
这时候他的好朋友聪聪,也想听vip音乐,但是不想开通某胶vip,于是找龙龙借了账号密码,听了几首vip专属音乐
/*
创建一个对象
姓名:龙龙
听过的音乐:看我72变,爱的主打歌
有一个自动续费的某胶vip:可以听vip歌曲
*/
const p1 = {
name:'龙龙',
music:['看我72变','爱的主打歌'],
listenMusicVIP(music1,music2){
console.log(`使用 ${p1.name} 的某胶vip听了vip歌曲,${music1},和${music2}`);
this.music.push(music1,music2);
}
};
console.log(`${p1.name}听过的vip歌曲有:${p1.music}`);
p1.listenMusicVIP('就是我','假如');
console.log(`${p1.name}听过的vip歌曲有:${p1.music}`);
console.log('=================== 分割线 ===================')
/*
创建另一个对象
姓名:聪聪
听过的音乐:光辉岁月
*/
const p2 = {
name:'聪聪',
music:['光辉岁月'],
};
console.log(`${p2.name}听过的vip歌曲有:${p2.music}`);
p1.charg.call(p2,'夜照亮了夜','单恋一枝花');
// p1.charg.apply(p2,['夜照亮了夜','单恋一枝花']);
// let f = p1.listenMusicVIP.bind(p2);
// f('夜照亮了夜','单恋一枝花');
console.log(`${p2.name}听过的vip歌曲有:${p2.music}`);
总结:
简单理解:this总是指向最终调用它的对象,也就是看它执行的时候是谁调用的
当我们需要使用在一个对象中使用其它对象里面的东西时候
就可以通过call,apply,bind来改变this的指向
** call,apply,bind的区别:**
- call(context,param1,param2,param3…)。接收多个参数,第一个为要指向的上下文,后面依次传入的实参
- apply(context,params[])。接收多个参数,第一个为要指向的上下文,第二个为多个实参组成的数组
- bind()。需要传入新的上下文,返回一个函数,可以在后面调用调用该函数(我借了vip,就不听,就玩儿)