call与apply的作用是明显的,但一直对其定义“动态改变某个类的某个方法的运行环境”了解不深,所以记个笔记归纳一下。
含义:apply:调用一个对象的一个方法,用另一个对象替换当前对象,例:B.apply(A,arguments);
call:应用一个对象的一个方法,用另一个对象替换当前对象,例:B.call(A,args1,args2);
相同点:方法的含义是一样的,即方法功能是一样的;
第一个参数的作用是一样的。
不同点:两者传入的列表形式不一样
call可以传入多个参数;
apply只能传入两个参数,以数组形式传入。
//call方法
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
//apply方法
function.apply(thisObj[, argArray]);
示例:
//代码比较
function add(a, b){
alert(a + b);
}
function index(a, b){
//用call方式借用print,参数显式打散传递
print.call(this, a, b);
//用apply方式借用print, 参数作为一个数组传递,
//这里直接用JavaScript方法内本身有的arguments数组
print.apply(this, arguments);
//或者封装成数组
print.apply(this, [a, b]);
}
存在的意义(以call为例):
基本用法:
//基本用法
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1);
//add替换sub,add.call(sub,3,1) == add(3,1);
继承:
//继承
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.naem);
}
}
function Cat(name){
Animal.call(this.name);
}
var cat = new Cat("Black Cat");
cat.showName();
//cat使用Animal的方法
多重继承:
//多重继承
function class1(){
this.showSub = function(a,b){
alert(a-b);
}
}
function class2(){
this.showAdd = function(a,b){
alert(a+b);
}
}
function class12(){
class1.call(this);
class2.call(this);
}