跟大家講解下有關js中的call()和apply()的理解 ,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說js中的call()和apply()的理解 ,小編也收集到了有關js中的call()和apply()的理解 的相關資料,希望大家看到了會喜歡。
在學習javascript的時候,對于call()和apply()的用法總是難以理解,相信很多小伙伴和我又一樣的想法。現在和小伙伴們分享一下。call語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定義:調用一個對象的一個方法,以另一個對象替換當前對象。
看完語法和定義還是難以理解,call函數可以接受若干個參數,其中第一個參數為當前操作的對象,后面幾個參數為調用的方法的參數,這么說還是難以理解,直接上代碼:
function Teacher(name, age) { //定義一個構造函數Teacher this.name = name; this.age = age; this.intro = function() { alert("My name is " + this.name + "," + "I'm " + this.age) }}function Student(name, age) { //定義一個構造函數Student Teacher.call(this, name, age); //Student調用了Teacher的方法}var studentA = new Student("Lily", 19); //實例化一個studentA,傳入參數studentA.intro(); //調用studentA的intro方法 輸出:My name is Lily,I'm 19??上例中,studentA是通過構造函數Student實例化的,本應該繼承Student構造函數的所有可繼承方法,但我們看到Student函數并沒有任何方法,但是Student調用了,可以說是繼承了Teacher的方法,故studentA也就有了intro()方法。其中代碼第十行起到了關鍵作用Teacher.call(this, name, age),此句的作用是令當前對象調用另一個對象的方法,this關鍵字在這里指代Student()對象,實例化以后this指代studentA對象,而后面的參數分別為Teacher傳入的參數。可能上面的例子不是很常見,但是我們經常見到這樣的代碼:
var str="你好美女";Array.prototype.join.call(str,"!"); //你!好!美!女??join方法是數組特有的方法,它是定義在Array()構造函數的原型中的方法,所以我們實例化的數組就都繼承了這個方法,但是字符串str是沒有join方法,但此處我們就借用了數組的join方法來處理字符串。在call左邊的表達式為借用的對象的方法,call()中的第一個參數對象借用call左邊表達式對象的方法(不知道這樣說能不能理解,將就吧)。
applyapply()方法的作用和call方法是一樣的,只是傳入的參數不同。
語法:apply([thisObj[,argArray]]) 定義:應用某一對象的一個方法,用另一個對象替換當前對象。
apply的第一個參數和call一樣,第二個參數是一個數組對象(類數組也可以),他不再是以單個參數列表的形式傳入參數,而是把所有參數都放到一個數組中,一起傳入。這里就不得不說到arguments對象,它存在于每個函數中,是函數所有實參組成的一個類數組對象。所以apply的第二個參數傳入arguments對象。看下面示例:
var arr=[2,3,12,5,234,199,21,1000,2432];var max=Math.max.apply(Math,arr);console.log(max); //2432數組中沒有求最大值得方法,但是Math對象里面有max可以求出最大值,因此我們使用apply方法讓數組繼承Math的max()方法,從而求出數組中的最大值,同樣上面的方法也可以用call()方法代替,只不過書寫較為麻煩,不便于閱讀,代碼為:
var max=Math.max.call(Math,2,3,12,5,234,199,21,1000,2432);console.log(max); //2432關于call和apply最基本的用法就是這些,當然這兩個函數的妙處遠遠不止這些,歡迎大神們補充。
以上就是js中的call()和apply()的理解 的詳細內容,更多請關注php中文網其它相關文章!
來源:php中文網