標籤:cat console lov var pre new des 需要 argument
本文根據知乎中一些大佬的回複整理完成,如有更深見解,歡迎加入討論~~
在js OOP中,經常會這樣定義:
function cat(){}cat.prototype = { food: ‘fish‘, say: function(){ console.log(‘I love ‘ + this.food); } }var blackCat = new cat;blackCat.say(); //I love fish
使用call和apply是為了動態改變this而出現的,當一個對象沒有某個方法,但是其他方法有,可以藉助call或apply來使用其他對象的方法來操作:
function cat(){}cat.prototype = { food: ‘fish‘, say: function(){ console.log(‘I love ‘ + this.food); } }var blackCat = new cat;blackCat.say(); //I love fishvar whiteDog = {food: ‘bone‘};blackCat.say.call(whiteDog); //I love bone
call 和 apply 的區別是,call 需要把參數按順序傳遞進去,而 apply 是把參數放在數組中傳遞。
因此,js 中某個函數的參數數量是不固定的,可以使用 apply,將參數 push 進數組進行傳遞,也可以使用 arguments 對象來進行遍曆擷取所有參數;在參數明確知道,數目確定的時候可以使用 call.
舉個例子:
通過document.getElementsByTagName 選擇的 dom-節點是一種類似於array的對象,但是它不能應用Array 下的 push , pop等方法,我們可以通過:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName(‘*‘));
這樣domNodes 就可以使用Array 下所有的方法了。
call和apply