快速理解js中的call,apply的做用

今天被人問到js中的call,apply的區別和用途,解釋了一番後,想到以前在逼乎上看到一位小夥伴生動形象的解釋javascript

自己不難理解,看下MDN就知道了,可是不經常使用,遇到了,還要腦回路迴轉下。或者時間長了,仍是要肯定下去看下文檔,爲了方便記憶:java

貓吃魚,狗吃肉,奧特曼打小怪獸。數組

有天狗想吃魚了app

貓.吃魚.call(狗,魚)dom

狗就吃到魚了this

貓成精了,想打怪獸spa

奧特曼.打小怪獸.call(貓,小怪獸)prototype

或者 馬雲.賺錢.call(我)code

 

還有一位楊志大佬解釋的更清楚對象

咱們要先明白存在call和apply的緣由,才能記得牢一點:

在javascript OOP中,咱們常常會這樣定義:
 
function cat(){
}
cat.prototype={
food:"fish",
say: function(){
alert("I love "+this.food);
}
}


var blackCat = new cat;
blackCat.say();

 

可是若是咱們有一個對象 whiteDog = {food:"bone"}, 咱們不想對它從新定義say方法,

那麼咱們能夠經過call或apply用blackCat的say方法:blackCat.say.call(whiteDog);

因此,能夠看出call和apply是爲了動態改變this而出現的,當一個object沒有某個方法,可是其餘的有,咱們能夠藉助call或apply用其它對象的方法來操做。

用的比較多的,經過document.getElementsByTagName選擇的dom 節點是一種相似array的array。

它不能應用Array下的push,pop等方法。咱們能夠經過:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

 

這樣domNodes就能夠應用Array下的全部方法了。

其餘的就不提了,講多了反而迷惑。
 

call 和apply的用法都是同樣的,知識傳參不一樣,apply是數組,call是參數

就這樣記住了。

相關文章
相關標籤/搜索