函数在调用时实际上通过call来调用的
    即 function test(){ }
    test(); —-> test.call();
    call/apply的作用是改变this的指向 指向的是我传进去的参数
    如果传的是null 就不改变
    例一
    function Person(age){
    this.age = age;
    }
    var person = new Person(20);
    var obj = { }
    Person.call(obj,50)
    //本来obj对象中没有任何属性
    //但是Person.call改变了this的指向 此时Person中的this指代的是obj
    //即 obj.age = age; 所以此时obj中就有了age属性 值为50

    例二
    应用:
    function Person(name,age){
    this.name = name;
    this.age = age;
    }
    function Student(name,age,grade){
    Person.call(this,name,age);
    this.grade = grade;
    }
    var student = new Student(‘haha’,20,2020);
    //可以理解为Student对象构造方法在函数体的最前面加一个 var this = { }
    //然后这个this传递给了Person 然后执行完Person的构造方法后
    //this就变为 this = { name : ‘haha’,20 }
    //最后执行this.grade = grade; 即 this = { name : ‘haha’,20,2020 }

    call/apply的**区别**
    后面传的参数形式不同 即传参列表不同
    call 需要把实参按照形参的个数传进去
    Person.call(this,name,age);
    apply 需要传一个数组(即arrguments)
    如 Person.apply( this,[name,age] );