共同点:
- 调用一个对象的一个方法,用另一个对象替换当前对象
- 将一个函数的对象上下文从初始的上下文改变为由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]