1.call 和 apply 基本知识点
基本的语法格式:
Function.apply(obj,[]) 第二个参数必须是数组,或者arguments
Function.apply(obj,args)
注意到,call()与apply()的区别:功能一样。第二个参数形式不一样。call传递多个参数,是任意形式。apply第二个参数必须是数组形式。
用代码来理解它们区别最好:
例子1:
function add(a,b){
alert(a+b);
}
function subInfo(a,b){
alert(a-b);
}
add.apply(subInfo,[9,1]) //实际调用的是subInfo的方法;
add.call(subInfo,9,1) //实际调用的是subInfo的方法;
-----上面这个例子有问题;
例子2
例子1并没有任何的实际意义,来看例子2吧
function person(name,age){
this.name=name;
this.age=age;
}
person.prototype={ //这个相当于静态方法,被"类"所共有的
action:function (){
alert("sleep . eat. fuck.")
}
}
function Animal(type){
this.type=type;
}
var p=new person('阿呆',18);
p.action();
//这时候,动物类也想 拥有action 方法,那么就可以以;
p.action.call(Animal); //JS 中一切皆对象,函数名称为对象引用。
var a=new Animal("DOG");
a.action();
//作用:动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作
//聪明的你一定想到了继承;那 我们接着看列子三吧;
例子3
function person(name,age){
this.name=name;
this.age=age;
}
person.prototype={
action:function (){
alert("sleep . eat. fuck.")
}
}
function student(classID,grade){
this.classID=classID;
this.grade=grade;
// person.call(this,"阿呆",18)
person.apply(this,["阿呆",18]) //动态改变this而出现的
}
var stu=new student("110",100);
alert(stu.name); //结果:阿呆;
2.在开发中的实际应用
实际应用一:
js面向对象编程中的继承。
实际应用二:
求最大,最小值
比如
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
但是在很多情况下,我们需要找出数组中最大的元素。
var arr=[5,7,9,1]
alert(Math.max(arr)) // 这样却是不行的。一定要这样写
通常我们会自定义一个方法
function getMax(arr){
var len=arr.length;
for(var i=0,ret=arr[0];i<len;i++){
ret=Math.max(ret,arr[i]); //流行数组中最大的一个;
}
return ret;
}
改进:
function getMax(arr){
return Math.max.apply(null,arr)
}
//方便快捷,帅,原理就是:这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3)
实际应用三
Array.prototype.push 可以实现两个数组合并
var arr1=[1,3,4];
var arr2=[3,4,5];
如果我们要把 arr2展开,然后一个一个追加到 arr1中去,最后让 arr1=[1,3,4,3,4,5] arr1.push(arr2) 显然是不行的。
因为这样做会得到 [1,3,4, [3,4,5] ]
你也可以自定意义一个方法;
如:
var len=arr2.length;
for(var i=0;i<len;i++){
arr1.push.(arr2[i])
}
//不过 自从有了 apply之后;一切如此简单;
Array.prototype.push.apply(arr1,arr2)