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 相关文章推荐
window.location.hash 属性使用说明
Mar 20 Javascript
JQuery select标签操作代码段
May 16 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
js实现四舍五入完全保留两位小数的方法
Aug 02 Javascript
JQuery控制DIV的选取实现方法
Sep 18 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
Oct 13 Javascript
jQuery File Upload文件上传插件使用详解
Dec 06 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
vue插件vue-resource的使用笔记(小结)
Aug 04 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
Apr 27 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
PHP的面试题集
2006/11/19 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JQuery基础语法小结
2015/02/27 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
Python字典遍历操作实例小结
2019/03/05 Python
python实现简单五子棋游戏
2019/06/18 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
python解包概念及实例
2021/02/17 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
摄影实习自我鉴定
2013/09/20 职场文书
老教师工作总结的自我评价
2013/09/27 职场文书
运动会广播稿300字
2014/01/10 职场文书
员工手册编写范本
2015/05/14 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
Pandas搭配lambda组合使用详解
2022/01/22 Python