apply vs call
apply
与 call
的功能一样,都是: 劫持另外一个对象的方法,继承另外一个对象的属性,区别在于使用时传参不同,具体如下:
// apply使用
FunctionName.apply(obj, args) 该方法接受两个参数
obj: 这个对象将代替FunctionName类里this对象
args: 这个是数组,它将作为参数传递给FunctionName,并且传递过去的参数不再是数组,而是参数列表
// call使用
FunctionName.call(obj, [param1 [, param2 [, param3]]])
obj: 这个对象将代替FunctionName类里this对象
params: 这个是一个参数列表,相当于 args = [param1 [, param2 [, param3]]]
// 举个例子
function Person(name, age) {
this.name = name;
this.age = age;
}
function Student(name, age, grade) {
console.info('arguments:', JSON.stringify(arguments));
// arguments: {"0":"js","1":12,"2":100}
Person.apply(this, arguments);
this.grade = grade;
}
let student = new Student('js', 12, 100)
console.info('student: ', JSON.stringify(student));
// student: {"name":"js","age":12,"grade":100}
由于apply可以将一个数组解析为一个一个的参数,那么我们在很多地方,都可以方便的使用一些函数,例如求取最大值,最小值,数组拼接等等
// 求最大值
const a = [1, 2, 3];
const max = Math.max.apply(null, a); // 等价于 Math.max(1, 2, 3)
// 求最小值
const a = [1, 2, 3];
const min = Math.min.apply(null, a); // 等价于 Math.min(1, 2, 3)
// 拼接数组
const arr1 = ['a', 'b', 'c'];
const arr2 = ['d', 'e'];
const arr3 = Array.prototype.push.apply(arr1, arr2); // 等价于 arr1.push('d', 'e')
网友评论