文档章节

js apply()使用详解

710378720
 710378720
发布于 2015/08/07 16:03
字数 1461
阅读 6
收藏 0

主要我是要解决一下几个问题:   

1.apply和call的区别在哪里  

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

3.apply的其他巧妙用法(一般在什么情况下可以使用apply)  


我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用.  

  

         apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.  

  

 Function.apply(obj,args)方法能接收两个参数  

obj:这个对象将代替Function类里this对象  

args:这个是数组,它将作为参数传给Function(args-->arguments)  

  

         call:和apply的意思一样,只不过是参数列表不一样.  

  

 Function.call(obj,[param1[,param2[,…[,paramN]]]])  

obj:这个对象将代替Function类里this对象  

params:这个是一个参数列表  

  

1.apply示例:  

<script type="text/javascript">   

/*定义一个人类*/   

function Person(name,age) {   

    this.name=name; this.age=age;   

}   

 /*定义一个学生类*/   

functionStudent(name,age,grade) {   

    Person.apply(this,arguments); this.grade=grade;   

}   

//创建一个学生类   

var student=new Student("qian",21,"一年级");   

//测试   

alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);   

//大家可以看到测试结果name:qian age:21 grade:一年级   

//学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处.   

</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来装换一下这个数组,即:  

vararr1=new Array("1","2","3");   

 vararr2=new Array("4","5","6");   

Array.prototype.push.apply(arr1,arr2);   

  

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

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

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

  

5.总结:  

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

还有比如第四部分得内容,巧妙的解决了实实在在存在的问题,这个肯定不是一个初学者能想到的解决方案(这个也不是我自己想的),没有对编程有一定认识的不会想到这个的,还是一句话,多积累,多学习,提升自己的能力和对编程思想的理解能力才是最关键! 

本文转载自:http://blog.csdn.net/business122/article/details/8000676

710378720
粉丝 0
博文 1
码字总数 0
作品 0
西安
架构师
私信 提问
《你不知道的JavaScript》系列分享专栏

《你不知道的JavaScript》系列分享专栏 你不知道的JavaScript”系列就是要让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途 《你不知道的JavaScrip...

开元中国2015
2018/12/01
54
0
JavaScript中call()与apply()有什么区别?

今天读《JavaScript权威指南》时发现其中有段代码用到了apply方法用于递归实现数组的展开。可是我不懂这个函数的用法,因此查了一下,将资料整理如下。 Javascript的每个Function对象中有一个...

小微
2012/08/27
6.5K
1
趣谈js的call和apply两大召唤术

前言 在《趣谈js的bind牌胶水》这篇文章中,我聊到了js的bind胶水,这篇文章我来聊聊js的call和apply这对孪生兄弟。 Why? ——> 为什么会出现apply和call? 在《趣谈js的bind牌胶水》中,我...

hanmin
2018/05/21
0
0
你不知道的JavaScript系列

1、你不知道的JavaScript–Item1 严格模式 2、你不知道的JavaScript–Item2 浮点数精度 3、你不知道的JavaScript–Item3 隐式强制转换 4、你不知道的JavaScript–Item4 基本类型和基本包装类...

大灰狼的小绵羊哥哥
03/19
0
0
每个JavaScript工程师都应懂的33个概念

摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:stephentian Fundebug经授权转载,版权归原作者所有...

Fundebug
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

射频特征阻抗

Characteris Impendance(特性阻抗,也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一,但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。...

demyar
17分钟前
1
0
Spring Boot Tomcat配置项

参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似。 所有参数绑定配置类:org.springframework.boot.autoconfigure.web.Serv...

xiaomin0322
21分钟前
2
0
微课程 | 第二课《Docker 安装方式介绍》

微课程 | 第二课《Docker 安装方式介绍》视频 https://v.youku.com/v_show/id_XNDQ0NDUzNjkxNg==.html?spm=a2hzp.8244740.0.0 上一期我们介绍了 DBLE 的基本概况,下面进入我们的正题,正题基...

爱可生
21分钟前
2
0
GUAVA--基础工具(Preconditions)

1、前置条件 俗话说丑话讲在前面,在做某些事情的时候是需要做一些前置条件的。假如需要修改一条数据的话,当参数传进来,我们要先查询这条数据是否存在。这时候就需要一个if了,如果参数还需...

MrYuZixian
35分钟前
6
0
PythonSpot 中文系列教程 · 翻译完成

原文:PythonSpot Python Tutorials 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 在线阅读 ApacheCN 学习资源 目录 PythonSpot 中文系列教...

ApacheCN_飞龙
43分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部