call函数
调用一个对象的方法,用另一个对象替换当前对象。
使用场景:
1、适用于构造函数中的this的指向问题
将A对象中的函数(fn),赋值给一个变量 ( fn_var ),直接执行该函数时( fn_var()
),该函数的this指向发生变化,指向了window对象,导致this所对应属性(如:this.age)报错undefine,如果使用 fn_var.call(A) 则可以解决this的指向问题
2、为对象临时添加方法
A函数 . call (B对象,传参):B对象拥有了A函数的方法,如果A函数和B对象存在同样的参数,则进行覆盖保留A函数的
call和apply区别(apply是2个参数,对象及传参数组)
fn.apply(thisObj,[a1,a2,a3,....])
fn.call(thisObj,a1,a2,a3,....)
function han(a1,a2){
console.log('this 的值:'+this);
for(i in arguments){
console.log('第'+i+'个参数是:'+arguments[i]);
}
}
han(1,2);
//执行结果:
//this 的值:[object global]
//第0个参数是:1
//第1个参数是:2
han.call();
//执行结果:
//this 的值:[object global]
han.call(1,2);
//执行结果:
//this 的值:1
//第0个参数是:2
han.apply(1,[2]);
//执行结果:
//this 的值:1
//第0个参数是:2
function Stu(){
this.name="ls";
this.age="12";
this.getInfo=function(){
return '姓名:'+this.name+'\n年龄:'+this.age;
}
}
function Teacher(){
this.name="lsmife";
this.age="28";
this.getTearcher=function(){
return '姓名:'+this.name+'\n年龄:'+this.age;
}
}
var studentA=new Stu();
Teacher.apply(studentA);
console.log(studentA.getTearcher());
//姓名:lsmife
//年龄:28
console.log(studentA.getInfo());
//姓名:lsmife
//年龄:28
//相同属性执行了覆盖操作
var T=new Teacher();
var getTo=T.getTearcher();
console.log(getTo);
//姓名:lsmife
//年龄:28
var getTf=T.getTearcher;
console.log(getTf());
//姓名:undefined
//年龄:undefined
console.log(getTf.call(T));
//姓名:lsmife
//年龄:28
详细参见:https://msdn.microsoft.com/zh-cn/library/h2ak8h2y(v=vs.94).aspx