apply和call的區別及應用
阿新 • • 發佈:2018-12-21
共同點:
- 呼叫一個物件的一個方法,用另一個物件替換當前物件
- 將一個函式的物件上下文從初始的上下文改變為由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]