函数在调用时实际上通过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] );