我们知道call、apply、bind 的作用是改变 this的指向,那么我们为什么要改变this的指向?
场景例子:
/* 改变this指向 call, apply 和 bind */ let obj = { name: '小红', say: function(sex, age) { console.log(this.name, sex, age'结果') } } obj.say('女', 12) // 打印结果 小红 女 12 再建一个对象: let obj2 = { name: '小明' } // obj2.say(); // Uncaught TypeError: obj1.sayHello is not a function
obj2
也想用 say
方法且自己不创建,该怎么办?此时就需要用到这三个方法, 改变obj
的this
指向, 将其指向obj2
,就可以调用say方法
1、call
用法:call(target, arg1, arg2, ...), target 需要指向的目标对象,即boj2
,arg1 为参数
let obj = { name: '小红', say: function(sex, age) { console.log(this.name, sex, age, '岁') } } let obj2 = { name: '小明' } obj.say.call(obj2, '男', 12) // 小明 男 12 岁
2、apply
用法:apply(target, [arg1, arg2]), target 需要指向的目标对象,即boj2
,arg1 为参数,参数为数组的形式
let obj = { name: '小红', say: function(sex, age) { console.log(this.name, sex, age, '岁') } } let obj2 = { name: '小明' } obj.say.apply(obj2, ['男', 12]) // 小明 男 12 岁
3、bind
用法:bind(target, arg1, arg2, arg3, ...), target 需要指向的目标对象,即boj2
,arg1 为参数
let obj = { name: '小红', say: function(sex, age) { console.log(this.name, sex, age, '岁') } } let obj2 = { name: '小明' } obj.say.bind(obj2, '男', 12)() // 小明 男 12 岁
总结
- call 和 bind 传参数的方式一样
- apply 传参数的方法为
数组
的形式 call
和apply
是立即执行
的,但是bind
则需要手动执行
- 共同点则是都是改变
this
的指向