JS-apply-call的使用

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) 

       

     

 

 

posted @ 2015-09-12 15:21  咕-咚  阅读(152)  评论(2)    收藏  举报