一、apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性。
Function.apply(obj, args) 方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)
// 定义一个人类
function Person(name, age) {
this.name = name;
this.age = age;
}
// 定义一个学生类
function Student(name, age, grade) {
Person.apply(this, arguments);
this.grade = grade;
}
// 实例化一个学生类
var s = new Student('Jon', 18, '大一');
console.log(s.name, s.age, s.grade);
// Jon 18 大一
学生类里面没有给name和age属性赋值,为什么又存在这两个属性的值呢?这个就是apply的神奇之处。
分析:
Person.apply(this, arguments);
this:在创建对象在这个时候代表的是Student
arguments:是一个数组,也就是['Jon', 18, '大一'];
即用Student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了Student对象里面。
二、apply的一些其他巧妙用法
在调用apply方法的时候,第一个参数是对象this,第二个参数是一个数组集合,在调用Person的时候,方法需要的不是一个数组,而是一个一个的参数。apply的一个巧妙的用处,就是可以将一个数组转换为参数列表([param1, param2, param3] 转换为 param1, param2, param3) 。如果用程序实现数组的每一个项,转换为参数的列表,可能都得费一会功夫。借助apply的这点特性可以提高效率。
1.Math.max 可以实现得到数组中最大的一项
因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决:
var max = Math.max.apply(null, array);
这样就可以得到一个数组中最大的一项(apply会将一个数组转换为一个参数接一个参数的传递给方法)
这块在调用的时候第一个参数给了一个null,因为没有对象去调用这个方法,直接传递了一个null。