美文网首页
call和apply

call和apply

作者: 希染丶 | 来源:发表于2019-05-27 10:57 被阅读0次

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);

相关文章

网友评论

      本文标题:call和apply

      本文链接:https://www.haomeiwen.com/subject/nhngzqtx.html