它们共同的含义:
都是一个对象劫持另一个对象的方法,继承另一个对象的属性
相同点:
都可以改变this的指向
不同点:
他们的参数call可以写多个参数
apply只能有两个参数(所以第二个参数可以放置数组或伪数组arguments)
他们存在的意义实现多重继承方法的属性
都是一个对象劫持另一个对象的方法,继承另一个对象的属性的
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指向的函数所传入的参数值
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
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);