ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

apply与call

2026/10/4 1:04:28 拓冰建站 浏览量
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);