apply与call

2024-01-08 18:21:41

?概述:

它们共同的含义:

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

相同点:

都可以改变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);

文章来源:https://blog.csdn.net/qq_41429765/article/details/120487577
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。