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 相关文章推荐
Javascript操纵Cookie实现购物车程序
Nov 23 Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
Jul 24 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
Jul 27 Javascript
JavaScript中用let语句声明作用域的用法讲解
May 20 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
Angular表格神器ui-grid应用详解
Sep 29 Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
vue自动化表单实例分析
May 06 Javascript
对vue中v-on绑定自定事件的实例讲解
Sep 06 Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 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实现的RSS生成类实例
2015/04/23 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
python调用shell的方法
2013/11/20 Python
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
2014年财政所工作总结
2014/11/22 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
2015个人半年总结范文
2015/03/09 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
永不妥协观后感
2015/06/10 职场文书
运动会报道稿大全
2015/07/23 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL