JavaScript中call和apply方法的用法与区别详解
本文详细解析JavaScript中call和apply两个核心方法。通过对比语法定义,说明两者在参数传递上的区别:call接受参数列表,apply接受数组。结合代码实例演示如何利用这两个方法改变函数执行时的this指向,实现对象方法的复用、单继承以及多重继承,帮助开发者深入理解JS面向对象编程中的上下文切换机制。
call和apply方法定义与语法
1、方法定义
call方法: 语法格式为:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:该方法用于调用一个对象的方法,并将当前对象替换为另一个指定的对象。 说明: call方法允许一个对象借用另一个对象的方法。它可以将函数的执行上下文(this)从初始对象更改为由thisObj指定的新对象。 如果未提供thisObj参数,则默认使用Global对象作为thisObj。
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),因此运行结果为:alert(4); // 注意:在js中,函数本质上是对象,函数名是对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()方法放到cat上来执行,因此this.name应该是Cat
利用call实现对象继承
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的方法以及属性了.
利用call实现多重继承
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就实现了多重继承 当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call的用法。说了call,当然还有apply,这两个方法基本上是一个意思,区别在于call的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments 还有callee,caller..
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
