1. apply的定义
func.apply(obj, args);
- obj:这个对象将代替Function类里的this对象
- args:这个是数组,他讲作为参数传给Function(args–>arguments)
call方法和apply一样,唯一区别是参数列表不一样
func.call(obj, [param1, param2, ...]);
- obj:这个对象将代替Function类里的this对象
- params:参数列表
2. apply的使用方法一
函数的劫持 对象的复制
示范代码:
<script>
/*定义一个类, 人类*/
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function () {
console.log("hello");
}
}
/*定义一个类,学生类*/
function Student(name, age, grade) {
Person.apply(this, arguments);
this.grade = grade;
}
var s1 = new Student("Anna", "13", "6");
console.log(s1.name); //Anna
console.log(s1.age); //13
console.log(s1.grade); 6
s1.sayHello(); //hello
</script>
可以看到,Student类中并不具备任何方法,但是在 Person.apply(this,arguments)
后,他就具备了 Person类的sayHello
方法以及所有属性
由此得出结论:
Function.apply() 能“劫持”另外一个对象, 继承另外一个对象的属性。
3. apply的使用方法二
利用apply的参数数组化提升程序的性能
在上面例子中,调用apply
方法的时候,第一个参数是对象(this),,第二个参数是一个数组集合,在调用Person的时候,仍然可以将数组解析为一个一个的参数,复制给另外一个对象,这个就是apply的一个巧妙的用处:
可以将一个数组默认的转换为一个参数列表,即[param1,param2,param3]
转换为 param1,param2,param3)
借助apply的这点特性,可以延伸以下高效率的方法:
1)得到数组中最大/最小的一项
var arr = [1,3,5,89,53,6];
var a = Math.max.apply(null, arr);
var b = Math.min.apply(null, arr);
console.log(a); //89
console.log(b); //1
因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)
这块在调用的时候第一个参数给了一个null
,这个是因为没有对象去调用这个方法,只需要用这个方法帮忙运算,得到返回的结果就行,所以直接传递了一个null过去
2)合并数组
var arr1 = [1, 3, 2];
var arr2 = [4, 7, 8];
Array.prototype.push.apply(arr1, arr2);
console.log(arr1);
// (6) [1, 3, 2, 4, 7, 8]
原理同上查找最大/最小值,因为push方法不接收数组作为参数,可以利用apply的特性,把数组解析为一个一个的参数传递给方法。
通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:
一般在目标函数只需要n个参数列表,而不接收一个数组的形式,可以利用apply巧妙的解决这个问题
参考:
https://blog.csdn.net/myhahaxiao/article/details/6952321
https://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html