apply()和call()这两个方法的作用是一样的,都是在特定作用域中调用函数,等于设置函数体内this对象的只,以扩充函数赖以运行的作用域
apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性
Function.apply(obj,arguments)方法能接收两个参数
boj:这个对象将代替function累里this对象
argument:这个是数组,它将作为参数传给function
call和apply的意思一样,只是参数列表不一样
function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替function类里this对象
params:这是一个参数列表
1、apply示例
<script> //定义一个人类 function Person(name,age){ this.name = name, this.age = age } //定义一个学生类 function Student(name,age,grade){ Person.apply(this,arguments); this.grade = grade; } var student = new Student("zhangsan",21,"一年级"); alert("name:"+student.name+" "+"age:"+student.age+" "+"grade:"+student.grade); //输出结果:name:zhangsan age:21 grade:一年级 </script>
分析:Person.apply(this,arguments);
this:在创建对象在这个时候代表的是student
argument:是一个数组,也就是["zhangsan",21,"一年级"];
也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就讲属性创建到了student对象里面
2、call示例
在Student申述里面可以将apply修改为:Person.call(this,name,age)
当参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(Person和Student的参数列表前两位是一致的)使用apply
如果Person的参数列表是(age,name),而Student的参数列表是(name,age,grade)使用call
在Math.max()中求数组的最大值
Math.max([param1,param2,...])这样是不支持数组的,但是他支持Math.max(param1,param2,...),这时我们可以使用Math.max.apply(null,array)