JavaScript中call与apply方法的用法及区别详解
本文深入解析JavaScript中call和apply方法的核心机制,阐述它们如何改变函数执行时的this指针指向。通过具体代码示例演示如何利用这两个方法实现对象方法的复用与模拟类继承,并详细对比两者在参数传递方式上的关键区别:call接受逗号分隔的参数列表,而apply仅接受数组形式的参数。
call与apply方法概述
call方法能够动态改变函数执行时的上下文this指针,与之功能相似的还有apply方法。这两个方法通常用于JavaScript对象方法之间的相互调用,以确保当前this实例指针的一致性,或在特定场景下需要强制改变this指向时使用。
obj1.method1.call(obj2,argument1,argument2)
上述语法展示了call的作用:将obj1的方法迁移到obj2上执行,其后的argument1等参数作为实际参数传入该方法。
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),因此运行结果弹出alert(4)。需要注意的是,在JavaScript中函数本质上是对象,函数名只是对Function对象的引用。
复杂场景下的this指向
接下来看一个稍微复杂的示例。
代码如下:
function Class1() {
this.name = "class1";
this.showNam = function() {
alert(this.name);
}
}
function Class2() {
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showNam.call(c2); 这里call的作用是将c1的方法应用到c2上执行。原本c2并没有showNam()方法,现在通过call将c1的showNam()方法绑定到c2上执行,因此this.name指向c2的name属性,即"class2",最终执行结果为alert("class2")。
利用call实现继承
此外,还可以利用call方法来实现继承效果。
代码如下:
function Class1() {
this.showTxt = function(txt) {
alert(txt);
}
}
function Class2() {
Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc"); 通过Class1.call(this),Class2实现了继承Class1的功能。这行代码的意思是使用Class1对象替换当前的this对象,使得Class2拥有Class1的所有属性和方法,因此c2对象可以直接调用Class1的方法及属性,执行结果弹出alert("cc")。
这就是JavaScript模拟面向对象中继承机制的方式,并且还可以实现多重继承。
多重继承的实现
代码如下:
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);
} 1.call方法
call方法语法与参数
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj 可选项。将被用作当前对象的对象。
arg1, arg2, , argN 可选项。将被传递方法参数序列。
2.apply方法
apply方法语法与参数
应用某一对象的一个方法,用另一个对象替换当前对象。
apply([thisObj[,argArray]])
参数
thisObj 可选项。将被用作当前对象的对象。
argArray 可选项。将被传递给该函数的参数数组。
两者的区别:
call与apply的区别
两者实现的功能完全一致,主要区别在于参数传递方式:call方法将各个参数以逗号(,)分隔的形式传入,而apply方法则是将所有参数封装在一个数组中进行传递。
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
