前端---js中的call和apply方法用法
阿新 • • 發佈:2018-12-13
最近看到JavaScript中關於call()和apply()方法可以用來呼叫函式的動態呼叫和實現偽繼承兩種功能,今天在這裡給大家詳細介紹一下.
1.call()函式
函式引用.call(呼叫者,引數1,引數2...)
等同於:呼叫者.函式(引數1,引數2...)=函式.call(呼叫者,引數1,引數2)
2.apply()函式
函式呼叫.apply(呼叫者,[引數1,引數2...])
函式呼叫.call(呼叫者,引數1,引數2...)=函式呼叫.apply(呼叫者,[引數1,引數2...])
相同點和不同點:
相同之處:
js中每個函式都包含兩個非繼承而來的方法:call()方法和apply()方法.
apply()方法和call()方法的功能基本完全相同,都可以動態呼叫函式.
不同之處:
通過call()呼叫函式時,必須在括號中詳細地列出每個引數.
通過apply()動態地呼叫函式時,需要以陣列形式一次性傳入所有呼叫引數.
3.使用apply()或call()實現偽繼承:
偽繼承實現的關鍵在於子類構造器需要以this作為呼叫者來呼叫父類構造器,這樣父類構造器中的this就會變成代表子類,子類就可以得到原父類定義的例項屬性和方法,因此這種偽繼承方式完全可以用apply或call來實現,只要在使用apply或call呼叫時指定this作為呼叫者即可.我們在下面寫個例項看看具體效果:
function Person(name,age){
this.name=name;
this.age=age;
}
function Student(name age grade){
Person.call(this,name ,age);
Person.apply(this,[name,age]);
this.grade=grade;
}
上面程式中以this作為呼叫者呼叫Person的構造器---這種方法即可用apply呼叫實現,也可用call呼叫實現,這行apply呼叫或call呼叫即可代替前面偽繼承實現方式的構造器中兩行粗體字程式碼.