对于apply和call一直比较模糊,不懂是啥?能做啥?在啥情况下用它?最近在网上搜了一些资料,总算有些眉目,在这里和大家分享,若有不对或者不明确的地方希望读者多多提一些意见。
apply及call定义
apply:能劫持另外一个对象的方法,继承另外一个对象的属性
function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替function类里this对象
args:这个是数组,它将作为参数function(args -->arguments,需要注意的是arguments指的是函数的实参组成的数组)
call:和apply的意思一样,只不过是参数列表不一样
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表
apply实例
function Person(name,age){ //定义一个类,人类
this.name=name; //名字
this.age=age; //年龄
this.sayhello=function(){alert("hello")};
}
function Print(){ //显示类的属性
this.funcName="Print";
this.show=function(){
var msg=[];
//this指的是谁调用这个方法指的就是谁
for(var key in this){
if(typeof(this[key])!="function"){
msg.push([key,":",this[key]].join(""));
}
}
alert(msg.join(" "));
};
}
function Student(name,age,grade,school){ //学生类
Person.apply(this,arguments);
Print.apply(this,arguments);
this.grade=grade; //年级
this.school=school; //学校
}
解析: Person.apply(this,arguments);
- this代表的是student;
- arguments:类似一个数组,也就是[“zhangsan”,”21”,”一年级”],是指一个函数的实参;
call实例
在Studen函数里面可以将apply中修改成如下:Person.call(this,name,age);
什么情况下使用apply和call
给对象传参时,如果实参是数组,比如apply示例里面传递了参数arguments,这个参数是数组类型
,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply
, 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade)
,这样就可以用call来实现了,也就是直接指定参数列表对应值的位置
(Person.call(this,age,name,grade));
apply的一些巧妙用法
在调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) ,类似于es6的扩展符
。这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:
a) Math.max可以得到数组中最大的一项
因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组,但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决。var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法),这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去。
b) Array.prototype.push 可以实现两个数组合并
var arr1=[1,2,3,4,5];
var arr2=[6,7,8,9,10]
Array.prototype.push.apply(arr1,arr2);
console.log(arr1) //[1,2,3,4,5,6,7,8,9,10] arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.
总结
遇到自己有疑惑的知识点,不能懈怠,不懂装懂,一定要要把它理解透彻,你要相信你现在不解决,之后依旧会遇到,所以早解决早解脱啊~~~
网友评论