每个函数都包含两个非继承而来的方法,call()和apply()
call和apply用途
这两个方法的用途都是使函数能在特定的作用域中运行(改变函数运行时的作用域),换言之就是可以设置函数中this对象的值。apply()方法接收两个参数,一个是在其中运行函数的作用域,另一个是参数数组,举一个例子:
function product(){}
product.prototype={
color:"red",
say:function(){
console.log("my color is"+this.color);
}
}
var apple = new product();
apple.say();//my color is red
但此时我们有一个对象bananer={color:"yellow"},我们不想对它定义一个say方法,那么我们可以通过call或者apply方法借用apple中的say方法
function product(){}
product.prototype={
color:"red",
say:function(){
console.log("my color is"+this.color);
}
}
var apple = new product();
apple.say();//my color is red
var bananer = {color:"yellow"};
apple.say.apply(bananer);//my color is yellow
apple.say.call(bananer);//my color is yellow
显然,apply和call方法可以动态改变函数中的this
apply和call的区别
这两个方法的作用是一样的,仅有的一点区别是参数传递不同。
call方法需要把参数按顺序传递进去,而apply方法是将参数放在数组中传递进去。例如有一个函数定义如下:
var func=function(arg1,arg2){
};
可以通过如下方式来调用:
func.call(this,arg1,arg2);
func.apply(this,[arg1,arg2]);
所以apply方法特别适用于数组的操作。
1、数组之间的追加
push方法可以实现将一个或多个元素追加到数组末尾
例如arr.push(num1,num2,num3,...)但是不能实现将数组追加到另一个数组,此时数组可以利用apply调用push方法
2、求数组中最大值最小值var arr1=[1,2,3]; var arr2=[4,5,6]; //将arr2追加到arr1数组中 Array.prototype.push.apply(arr1,arr2); console.log(arr1);//[1,2,3,4,5,6]
数组本身没有求最大最小值的方法,但是Math对象有,Math.max(number1,number2,...);Math.min(number1,number2,...)是求离散的数的最大最小值,但这种方法不能直接运用于数组中,必须把数组中的数一个一个拆分进去才能使用,此时就可以运用applyvar arr=[1,20,30,100,50]; console.log( Math.max.apply(Math,arr));//100 console.log( Math.min.apply(Math,arr));//1
3、将伪数组转化为数组
var func=function(){ console.log(arguments instanceof Array); }; func();//false
var func=function(){ var arr=Array.prototype.slice.call(arguments); console.log(arr instanceof Array); }; func();//true
伪数组
伪数组就是具有length属性的json对象。特点:
1、key是0,1,2,3...这样的形式2.具有length属性 {0:"ouyang",1:"zhaoyu",2:"fangfang",length:3}是一个典型的伪数组,但是伪数组不是数组,自然不能调用数组中的方法。js中伪数组对象很多,例如:1.arguments 2.document.getElementsByTagName()、document.childNodes之类的,它们都返回NodeList对象都属于伪数组。 3.整个jQuery都是基于伪数组的