js-call-apply

call 和 apply

   call()apply都是修改this指向的, 区别是:call需要把实参按照形参的顺序个数传进去 apply 只需要传一个数组

   apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.       

     1) call

    function Person(name,age,sex){
         this.name=name;
         this.age=age;
         this.sex=sex;
      }
     function Student(name,age,sex,tel,color){
     //  下面new Student后就在这里形成了   var this={} 
       Person.call(this,name,age,sex)   //call 调用别人的方法或者属性 完成自己的功能

   //这里用call 调用 Person()方法的属性,完成自己功能
   // Person.call(this,name,age,sex)之后相当于在这里写上了 this.name=name;this.age=age;this.sex=sex;

      this.tel=tel;
      this.color=color;
    }
     var student=new Student("张三",22,"男",138,"red")
    //张三-22-男-138-red
    console.log(student.name+"-"+student.age+"-"+student.sex+"-"+student.tel+"-"+student.color)


    2) apply


       function   Wheel(size,width,heigth){
       this.size=size;
       this.width=width;
       this.heigth=heigth;
        }

       function  SteeringWheel(color,style){
      this.color=color;
      this.style=style;
       }

       function Factory(size,width,heigth,color,style){
           Wheel.apply(this,[size,width,heigth]);
           SteeringWheel.apply(this,[color,style])
        }   
     var factory=new Factory(120,100,90,"red","越野")

    //  120-100-90-red-越野
     console.log(factory.size+"-"+factory.width+"-"+factory.heigth+"-"+factory.color+"-"+factory.style)



     ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来), call 和 apply 。 这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this 的值


        /*apply()方法*/
        function.apply(thisObj[, argArray])

       /*call()方法*/
       function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

    它们各自的定义:

    apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。

    call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

    实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。


       (1)基本用法

        改变函数作用域

         function add(a,b){
             return a+b;  
         }
         function sub(a,b){
             return a-b;  
        }
         var a1 = add.apply(sub,[4,2]);  //sub调用add的方法
         var a2 = sub.apply(add,[4,2]);
         alert(a1);  //6     
         alert(a2);  //2


      function add(a,n){
         return  sub.call(this,2,4) //-2
       }
      function sub(a,n){
           return a-n
      } 

      /*call的用法*/
       var a1 = add.call(sub,4,2);
    
(2)实现继承 
    
       function Animal(name){
           this.name = name;
           this.showName = function(){
            alert(this.name);    
           }    
       }

        function Cat(name){
           Animal.apply(this,[name]);    
        }

        var cat = new Cat("咕咕");
        cat.showName();  //咕咕

        /*call的用法*/
        Animal.call(this,name);


  (3)多重继承   
    
         function Class10(){
            this.showSub = function(a,b){
             alert(a - b);
          }   
       }

       function Class11(){
           this.showAdd = function(a,b){
            alert(a + b);
         }  
      }

      function Class12(){
        Class10.apply(this);
        Class11.apply(this);   
        // Class10.call(this);
       //Class11.call(this);  
      }

      var c2 = new Class12();
      c2.showSub(3,1);    //2
      c2.showAdd(3,1);    //4

js-call-apply

上一篇:【转】苹果电脑怎么设置分辨率和调节字体大小


下一篇:基于Dapper的泛型Repository