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 相关文章推荐
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
Feb 23 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
jquery进行数组遍历如何跳出当前的each循环
Jun 05 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
May 14 Javascript
jquery实现的仿天猫侧导航tab切换效果
Aug 24 Javascript
jQuery ajax分页插件实例代码
Jan 27 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
jQuery操作css样式
May 15 jQuery
VueJs 搭建Axios接口请求工具
Nov 20 Javascript
Vue切换div显示隐藏,多选,单选代码解析
Jul 14 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
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
基于PHP生成静态页的实现方法
2013/05/10 PHP
php修改数组键名的方法示例
2017/04/15 PHP
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python实现超简单端口转发的方法
2015/03/13 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python判断数字是否是超级素数幂
2018/09/27 Python
Python中GIL的使用详解
2018/10/03 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
django认证系统 Authentication使用详解
2019/07/22 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
Django自带的用户验证系统实现
2020/12/18 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
偷看我的初中毕业鉴定
2014/01/29 职场文书
前处理班长职位说明书
2014/03/01 职场文书
医师定期考核实施方案
2014/05/07 职场文书
大型会议策划方案
2014/05/17 职场文书
党员作风建设自查报告
2014/10/23 职场文书
优秀英文求职信范文
2015/03/19 职场文书
美容院管理规章制度
2015/08/05 职场文书
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
vue判断按钮是否可以点击
2022/04/09 Vue.js