快速理解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是参数

就这样记住了。

相关文章
相关标签/搜索