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