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 相关文章推荐
ext form 表单提交数据的方法小结
Aug 08 Javascript
js 遍历json返回的map内容示例代码
Oct 29 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
Sep 03 Javascript
Javascript中this的用法详解
Sep 22 Javascript
javascript白色简洁计算器
May 04 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
详解Angularjs 自定义指令中的数据绑定
Jul 19 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
Sep 06 Javascript
vue简单练习 桌面时钟的实现代码实例
Sep 19 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 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
3.从实例开始
2006/10/09 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
php格式化json函数示例代码
2016/05/12 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
js实现碰撞检测
2021/01/29 Javascript
Python实现统计文本文件字数的方法
2017/05/05 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
控制工程专业个人求职信
2013/09/25 职场文书
平面设计师工作职责范文
2013/12/03 职场文书
求职信需要的五点内容
2014/02/01 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
《秋游》教学反思
2014/04/24 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2015团员个人年度总结
2015/11/24 职场文书