title: call和apply
date: 2019-03-15 09:42:52
tags: js
概念
每个Function对象,都带有一个apply()和call()方法
// 语法
function.apply(thisObj[, argArray])
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
apply() :调用一个对象的一个方法,用另一个对象替换当前对象。例如,B.apply(A, arguments);
即A对象应用B对象的方法
call() : 调用一个对象的一个方法,用另一个对象替换当前对象。 例如,B.call(A, arg1, arg2);
即A对象调用B对象的方法
共同之处:都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为有thisObj指定的新对象。
不同之处:
apply:最多只能有两个参数 新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeRrror。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被作为thisObj,并且无法传递任何参数
call: 可以接受多个参数,第一个参数和apply一样,后面是一串参数列表;主要用在js对象各方法互相调用的时候,使当前this指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么Golbal对象被用作thisObj。
实际上,apply和call功能一样,只是传入的参数列表形式不同。
实现继承
普通继承
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.apply(this,[name]);
}
var cat = new Cat("咕咕");
cat.showName();
/*call的用法*/
Animal.call(this,name);
多重继承
function a(){
this.showSub = function(a,b){
alert(a - b);
}
}
function b(){
this.showAdd = function(a,b){
alert(a + b);
}
}
function c(){
a.apply(this);
b.apply(this);
}
var c = new c();
c.showSub(3,1); //2
c.showAdd(3,1); //4
apply妙用
Math.max/Math.min得到数组中最大/小的一项
var arr = [1,2,3,4,5,6,7];
var max = Math.max.apply(null, arr);
var min = Math.min.apply(null, arr);
Array.prototype.push 可以实现两个数组的合并
var arr1 = [1,2,3,4,5];
var arr2 = [6,7,8,9,0];
var arr3 = Array.prototype.push.apply(arr1, arr2);
网友评论