JS中call()和apply()的功能及用法实例分析


Posted in Javascript onJune 28, 2019

本文实例讲述了JS中call()和apply()的功能及用法。分享给大家供大家参考,具体如下:

1.call()和apply()的作用

首先引出问题:用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下的push,pop等方法。我们可以通过:

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

这样domNodes就可以应用Array下的所有方法了。

2.call()和apply()的区别

首先apply的定义如下:

  • apply方法能劫持另外一个对象的方法,继承另外一个对象的属性
  • Function.apply(obj,args)方法能接收两个参数,第一个参数是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是数组,也可以是arguments对象
    • obj:这个对象将代替Function类里this对象
    • args:这个是数组,它将作为参数传给Function(args?>arguments)

apply()的用法

//定义一个人类
function Person(name,age){
  this.name = name;
  this.age = age;
}
//定义一个学生类
function Student(name,age,grade){
  Person.apply(this,arguments);//传入arguments对象
  //Person.apply(this,[num1,num2]);//传入数组
  this.grade = grade;
}
//创建一个学生类
var student = new Student('A','10','一年级');
//测试
console.log('name:'+student.name+'age:'+student.age+'grade:'+student.grade);

学生类里没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处。

分析:Person.apply(this,arguments);

  • this:代表的是student,表示将Person中的this指向student。
  • arguments:是一个数组,在例子中表示[‘A','10','一年级'];

通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就讲属性创建到了student对象里面.

apply()call()的作用是一样的,他们的区别仅在于接收参数的方式不同,call()需要把参数一个个列出来。

call()的用法

在Student函数里面可以将apply中修改成如下:

Person.call(this,name,age);

3.什么情况下用apply(),什么情况下用call()

至于是使用apply()还是call(),取决于采取那种给函数传递参数的方式最方便。

如果打算直接传入arguments对象,或者是数组,并且参数列表相同则使用apply();否则,选择call()可能更合适。

例:apply示例里面传递了参数arguments,并且在调用Person的时候参数的列表是对应一致的,也就是Person和Student的参数列表前两位是一致的,就可以采用apply。

如果我的Person的参数列表是这样的(age,name)而Student的参数列表是(name,age,grade),这样的就可以用call来实现了Person.call(this,age,name,grade);

关于apply()的应用可以参考://3water.com/article/164140.htm

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
关于JS控制代码暂停的实现方法分享
Oct 11 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
Jan 11 Javascript
jQuery中:gt选择器用法实例
Dec 29 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
Jun 13 Javascript
老生常谈JavaScript 函数表达式
Sep 01 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
浅析javascript中的Event事件
Dec 09 Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 Javascript
JavaScript简单拖拽效果(1)
May 17 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
Sep 28 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
Vuex实现购物车小功能
Aug 17 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
Jun 28 #Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 #Javascript
js实现随机数小游戏
Jun 28 #Javascript
Node爬取大批量文件的方法示例
Jun 28 #Javascript
JavaScript实现单英文金山打字通
Jul 24 #Javascript
javascript实现导航栏分页效果
Jun 27 #Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 27 #Javascript
You might like
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
PHP 断点续传实例详解
2017/11/11 PHP
mongodb和php的用法详解
2019/03/25 PHP
script标签属性type与language使用选择
2012/12/02 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
Python文件操作方法详解
2020/02/09 Python
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
一名毕业生的自我鉴定
2013/12/04 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
数控机床专业自荐信
2014/05/19 职场文书
趣味运动会广播稿
2014/09/13 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
房产授权委托书范本
2014/09/22 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
会议新闻稿
2015/07/17 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android