call和apply的理解

例子

假设有一个构造函数 Cat

function Cat(){}

在它的原型上定义一个方法:

Cat.prototype.food = 'fish';
Cat.prototype.say  = function(){
    alert('I like ' + this.food)
}

创建一个 Cat 的实例 miao, 就可以调用原型上的方法

let miao = new Cat();
miao.say(); //  I like fish

现在有一个实例 wang

let wang = {
  food: 'bone'
}

我们不想重新定义它的 say 方法,就可以通过 call 或者 apply 来调用 miaosay 方法

miao.say.call(wang);
miao.say.apply(wang)

也可以直接调用 Cat 的原型链的方法,实际上是相同的,因为 miao 调用的也是原型上的方法

Cat.prototype.say.call(wang)

讲解

callapply 都是为了改变函数运行时的上下文而存在的,也就是了为改变函数体内部 this 的指向

在举一个例子

let people = {
  name: 'jay',
  say(age, job){
     alert(`名字:${this.name}, 年龄:${age},职业:${job}`)
  }
}
let myName = {
 name: 'chow'
}

执行 people.say()

people.say(35, 'singer') // 名字:jay, 年龄:35,职业:singer

call 改变函数内部 this 的指向

people.say.call(myName, 31, 'coder') //名字:chow, 年龄:31,职业:coder

apply 改变函数内部 this 的指向

people.say.apply(myName, [31, 'coder']) //名字:chow, 年龄:31,职业:coder

可以看出 applythis 的区别就是传参形式不同

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值