JavaScript 中 call 方法的用法与继承模拟
本文详细解析 JavaScript 中 Function 对象的 call 方法。通过具体代码示例,说明如何利用 call 改变函数执行时的 this 指向,实现方法复用。同时演示了如何使用 call 模拟面向对象中的单继承与多重继承机制,并简要对比了 apply 方法的参数差异。
call 方法概述与语法
call 方法
请参阅
应用于:Function 对象
要求
版本 5.5
调用一个对象的方法,并以另一个对象替换当前上下文对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。指定作为当前上下文对象的对象。
arg1, arg2, , argN
可选项。指定传递给方法的参数序列。
说明
call 方法用于以另一个对象替换当前上下文来调用一个方法。该方法可将函数的对象上下文从初始上下文更改为由 thisObj 指定的新对象。
若未提供 thisObj 参数,则使用 Global 对象作为 thisObj。
-------------------------------------------------------------------------------------------
call 方法的基本用法解析
初看可能令人困惑,此处进行简要说明。
obj1.method1.call(obj2,argument1,argument2)
如上所示,call 的作用是将 obj1 的方法应用于 obj2 上执行,后续参数 argument1.. 等作为参数传入。
举一个具体的例子
代码如下:
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 对象的引用。
通过 call 改变方法执行上下文
看一个稍微复杂一点的例子
代码如下:
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() 方法,此处是将 c1 的 showNam() 方法在 c2 上执行,因此 this.name 应为 class2,执行结果即为:alert("class2");
利用 call 模拟对象继承
怎么样,觉得有意思了吧,可以让a对象来执行b对象的方法,这是java程序员所不敢想的。还有更有趣的,可以用 call 来实现继承
代码如下:
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}
function Class2()
{
Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc"); 这样 Class2 就继承Class1了,Class1.call(this) 的意思就是使用 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);
} 很简单,使用两个 call 就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法
call 与 apply 的区别
说了call ,当然还有 apply,这两个方法基本上是一个意思
区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments
还有 callee,caller,这个和call的 用法就不同了,放到下次讲吧 ,呵呵。
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
