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

發佈了51 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章