apply与call

 概述:

它们共同的含义:

都是一个对象劫持另一个对象的方法,继承另一个对象的属性

相同点:

都可以改变this的指向

不同点:

他们的参数call可以写多个参数

apply只能有两个参数(所以第二个参数可以放置数组或伪数组arguments)

他们存在的意义实现多重继承方法的属性

例一修改函数的this指向:

都是一个对象劫持另一个对象的方法,继承另一个对象的属性的

function first(name,age){
    this.name=name;
    this.age=age;
}
function second(name,age,grade){
    //apply继承方法的写法
    first.apply(this,arguments);
    //call继承方法的写法
    //first.call(this,name,age);
    this.grade=grade;
}
let val=new second('奥利奥',11,'二年级');

console.log('name'+val.name+'age'+val.age+'grade'+val.grade);
//因为second中并没有赋给this,name和age但仍然能输出age,name
//这是因为通过apply继承了first方法的属性或call继承了first方法的属性

apply在上方代码的使用分析:

first.apply(this,arguments);

将first的this指向改为second函数,this就是设置函数指向 

arguments是伪数组,就是在

let val=new second('奥利奥',11,'二年级')

arguments就等于['奥利奥',11,'二年级']这个数组的值

但是arguments无法调用数组的方法例如:slice,splice等

所以first.apply(this,arguments)就当于

first.apply(this,[奥利奥',11,'二年级'])

call在上方代码的分析:

first.call(this,奥利奥',11,'二年级'),第一个参数是this指向修改,以后的第二个,三个,四个参数都是设置被修改的this指向的函数所传入的参数值

例二修改对象的this指向

apply改变this指向举例

const obj={
    name:'name1',
    getObj:function(){
        return this.name;
    }
}

let objNew={
    name:'newVal'
}

console.log(obj.getObj());
console.log(obj.getObj.apply(objNew));
console.log(obj.getObj.call(objNew));

console.log(obj.getObj.apply(objNew));

apply修改getObj的this指向为objNew输出的内容:newVal
console.log(obj.getObj.call(objNew));

call修改getObj的this指向为objNew输出的内容:newVal

apply实际的应用

 let parmas=[4,6,5,42,3,41,35,67];
 let parma2s=[4,6,5,42,3,41,35,67];
 //Math.max和Math.min原本传参数只允许number类型,
 //通过apply可以传数组并得到数组中最大的值或最小的值
 console.log('获取数组中最大的值:'+Math.max(7.25,7.30));
 console.log('获取数组中最大的值:'+Math.max.apply(null, parmas));
 console.log('获取数组中最小的值:'+Math.min.apply(null, parmas));
 console.log('我是两个数组合并后的结果');
 console.log(Array.prototype.push(...parma2s,...parmas));//获取数组追加后数组的长度
 console.log(parma2s);
 /*使用数组劫持获取合并后的数组整个内容*/
 var arr1=new Array("1","2","3","4","5");
 var arr2=new Array("2","3","4","5","6");
 Array.prototype.push.apply(arr1,arr2)
 console.log(arr1);

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值