What is the difference between call and apply?

前端 未结 24 1705
太阳男子
太阳男子 2020-11-21 07:12

What is the difference between using call and apply to invoke a function?

var func = function() {
  alert(\'hello!\');
};
         


        
24条回答
  •  误落风尘
    2020-11-21 07:59

    Even though call and apply achive the same thing, I think there is atleast one place where you cannot use call but can only use apply. That is when you want to support inheritance and want to call the constructor.

    Here is a function allows you to create classes which also supports creating classes by extending other classes.

    function makeClass( properties ) {
        var ctor = properties['constructor'] || function(){}
        var Super = properties['extends'];
        var Class = function () {
                     // Here 'call' cannot work, only 'apply' can!!!
                     if(Super)
                        Super.apply(this,arguments);  
                     ctor.apply(this,arguments);
                    }
         if(Super){
            Class.prototype = Object.create( Super.prototype );
            Class.prototype.constructor = Class;
         }
         Object.keys(properties).forEach( function(prop) {
               if(prop!=='constructor' && prop!=='extends')
                Class.prototype[prop] = properties[prop];
         });
       return Class; 
    }
    
    //Usage
    var Car = makeClass({
                 constructor: function(name){
                             this.name=name;
                            },
                 yourName: function() {
                         return this.name;
                       }
              });
    //We have a Car class now
     var carInstance=new Car('Fiat');
    carInstance.youName();// ReturnsFiat
    
    var SuperCar = makeClass({
                   constructor: function(ignore,power){
                         this.power=power;
                      },
                   extends:Car,
                   yourPower: function() {
                        return this.power;
                      }
                  });
    //We have a SuperCar class now, which is subclass of Car
    var superCar=new SuperCar('BMW xy',2.6);
    superCar.yourName();//Returns BMW xy
    superCar.yourPower();// Returns 2.6
    

提交回复
热议问题