JavaScript 中 call 方法的用法与继承模拟

作者:纸飞机时间:2026-10-24 19:30:09浏览:227

本文详细解析 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的 用法就不同了,放到下次讲吧 ,呵呵。

作者最新文章