当前位置: 首页 > news >正文

JavaScript的apply()方法和call()方法

 1 <script type="text/javascript">
 2     /*定义一个人类*/
 3     function Person(name,age)
 4     {
 5         this.name=name;
 6         this.age=age;
 7     }
 8     /*定义一个学生类*/
 9     functionStudent(name,age,grade)
10     {
11         Person.apply(this,arguments);
12         this.grade=grade;
13     }
14     //创建一个学生类
15     var student=new Student("qian",21,"一年级");
16     //测试
17     alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
18     //大家可以看到测试结果name:qian  age:21  grade:一年级
19     //学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处.
20 </script>

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

this:在创建对象在这个时候代表的是student

arguments:是一个数组,也就是[“qian”,”21”,”一年级”];

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

2.        call示例

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

Person.call(this,name,age);

这样就ok了

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

在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));

4.        apply的一些其他巧妙用法

细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:

 

a)        Math.max 可以实现得到数组中最大的一项

因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组

但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)

         这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去

b)        Math.min  可以实现得到数组中最小的一项

同样和 max是一个思想 var min=Math.min.apply(null,array);

c)        Array.prototype.push 可以实现两个数组合并

同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:

1      vararr1=new Array("1","2","3");
2 
3      vararr2=new Array("4","5","6");
4 
5      Array.prototype.push.apply(arr1,arr2);

也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.

通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:

一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!

5.        总结:

一开始我对apply 非常的不懂,最后多看了几遍,自己多敲了几遍代码,才明白了中间的道理,所以,不管做什么事情,只要自己肯动脑子,肯动手敲代码,这样一个技术就会掌握…   

转载于:https://www.cnblogs.com/aixiuxiu/p/6226210.html

相关文章:

  • apache http server 开启ssl 与tomcat交互
  • 国际直拨电话号码格式
  • Spring-boot-admin功能说明
  • Linux 进程与线程六
  • UML课程复习重点
  • 前端面试通关指南
  • 网络广告计费方式常用术语
  • sails 跨域请求处理 -- config.cors
  • memcache命令
  • openlayers 3监听地图分辨率变化事件
  • Jython开发环境搭建
  • 【树莓派】树莓派网络对时间,时间调整
  • CodeDom系列四--Code生成
  • X 1 BT5kali
  • TCP协议中的三次握手和四次挥手(图解)【转】
  • Angular 4.x 动态创建组件
  • eclipse的离线汉化
  • IDEA 插件开发入门教程
  • Invalidate和postInvalidate的区别
  • Javascript Math对象和Date对象常用方法详解
  • JDK9: 集成 Jshell 和 Maven 项目.
  • vuex 学习笔记 01
  • 程序员该如何有效的找工作?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 码农张的Bug人生 - 见面之礼
  • 提醒我喝水chrome插件开发指南
  • 消息队列系列二(IOT中消息队列的应用)
  • 原生 js 实现移动端 Touch 滑动反弹
  • mysql面试题分组并合并列
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 移动端高清、多屏适配方案
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #DBA杂记1
  • #Z2294. 打印树的直径
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)逆序输出字符串
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET的微型Web框架 Nancy