call函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值