JavaScript中call与apply方法的详解与实例

作者:小括号时间:2026-10-28 16:51:53浏览:519

本文详细解析JavaScript中call和apply两个核心方法的语法定义、参数差异及实际应用场景。通过函数替换、属性方法借用以及模拟继承等具体代码实例,阐明如何利用这两个方法改变函数执行时的this指向,实现对象间的功能复用与多重继承逻辑。

call与apply方法定义

1、方法定义

call方法的语法结构为:call([thisObj[,arg1[, arg2[, [,.argN]]]]])。其核心定义是调用一个对象的方法,并使用另一个对象来替换当前的执行上下文对象。具体而言,call方法允许将一个函数的对象上下文从初始状态切换为由thisObj指定的新对象。若调用时未提供thisObj参数,则默认使用Global对象作为上下文。

apply方法的语法结构为:apply([thisObj[,argArray]])。其定义同样是应用某一对象的方法,并用另一个对象替换当前对象。需要注意的是,如果第二个参数argArray不是有效的数组或arguments对象,程序将抛出TypeError错误。当未提供argArray和thisObj任一参数时,Global对象将被用作thisObj,且此时无法传递任何额外参数。

call与apply常用实例

2、常用实例

a、

代码如下:

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),因此最终弹窗显示结果为4。这里需要理解JavaScript中函数本质上是对象,函数名即是对Function对象的引用。

b、

代码如下:

function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
    }  
}  
function Cat(){
this.name = "Cat";
}  
var animal = new Animal();
var cat = new Cat();
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。
//输入结果为"Cat"
animal.showName.call(cat,",");
//animal.showName.apply(cat,[]);

call的作用是将animal对象的方法移至cat上执行。尽管cat原本没有showName方法,但通过执行animal的showName,此时this指向了cat,因此输出结果为Cat。

c、实现继承

代码如下:

function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
     }    
 }    
function Cat(name){
Animal.call(this, name);
 }    
var cat = new Cat("Black Cat");
cat.showName();

Animal.call(this)的含义是使用Animal对象替代当前的this对象。这使得Cat内部拥有了Animal的所有属性和方法,从而Cat对象可以直接调用Animal的方法及属性。

d、多重继承

代码如下:

function Class10()
{
this.showSub = function(a,b)
    {
alert(a-b);
    }
}
function Class11()
{
this.showAdd = function(a,b)
    {
alert(a+b);
    }
}
function Class2()
{
Class10.call(this);
Class11.call(this);
}

通过连续使用两次call即可实现多重继承。虽然JavaScript还有其他继承方式(如原型链,此处不展开),但这展示了call的具体用法。此外,apply与call作用基本一致,主要区别在于参数传递形式:call的第二个参数可以是任意类型,而apply的第二个参数必须是数组或arguments对象。文中还提及了callee和caller等概念。

总结:

简而言之,call和apply产生的作用完全相同。

两者的主要区别在于传递参数的形式不同。

作者最新文章