1. 程式人生 > >apply和call的區別及應用

apply和call的區別及應用

共同點:

  • 呼叫一個物件的一個方法,用另一個物件替換當前物件
  • 將一個函式的物件上下文從初始的上下文改變為由thisObj指定的新物件

不同點

// apply方法,只能接收兩個引數,新this物件和一個數組argArray
function.apply(thisObj[, argArray]);

// call方法,可以接受多個引數,新this物件和一串引數列表
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

基本應用

function add(a,b){
  return a+b;  
}
function sub(a,b){
  return a-b;  
}

var a1 = add.apply(sub,[2,1]); //3
var a2 = sub.apply(add,[2,1]); //1

var a3 = add.call(sub,2,1); //3
var a4 = sub.call(add,2,1); //1

繼承

function People(name){
  this.name = name;
  this.say = function(){
        console.log('hi ' + this.name);    
    }    
}

function Girl(name){
  People.apply(this,[name]);    
}

function Boy(name){
  People.call(this,name);    
}

var nie = new Girl("nie");
var keith = new Boy("keith");

nie.say();    //hi nie
keith.say();    //hi keith

例項:把一個數組插到另一個數組的某個位置

var a = [1,2,3];
var b = ['a','b','c'];
//目標:將a陣列的第二項替換為b陣列

var index = 1;
b.unshift(index,1);    //將b陣列轉換為apply方法接收的陣列型別的引數
Array.prototype.splice.apply(a, b);
console.log(a); //[1,'a','b','c',3]