深入理解apply

版权声明:转载请注明出处 https://blog.csdn.net/Cathence/article/details/82849817

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

猜你喜欢

转载自blog.csdn.net/Cathence/article/details/82849817