JS中的call、apply方法

本文详细介绍了JavaScript中call和apply方法的区别与用法,包括如何使用这两种方法改变函数的上下文对象,以及它们在实现继承、多继承和方法借用等场景中的应用。

一、call()和apply()方法
call和apply,它们的作用都是将函数绑定到另外一个对象上去运行

两者的格式和参数定义:

call( thisArg [,arg1,arg2,… ] );       // 参数列表,arg1,arg2,...
apply(thisArg [,argArray] );                 // 参数数组,argArray

1.方法定义

call方法:调用一个对象的一个方法,以另一个对象替换当前对象。

语法:call( thisArg [,arg1,arg2,… ] );
说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
例如:

<script type="text/javascript">  
            var value = "global var";  

            function mFunc()  
            {  
                this.value = "member var";  
            }  

            function gFunc()  
            {  
                alert(this.value);  
            }         

            window.gFunc();      // show gFunc, global var                      
            gFunc.call(window);       // show gFunc, global var                        
            gFunc.call(new mFunc());     // show mFunc, member var                      
              gFunc.call(document.getElementById('idTxt'));   // show element, input text  
        </script>  

**全局对象window调用函数gFunc,this指向window对象,因此this.value为global var
**函数gFunc调用call方法,this默认指向第一个参数window对象,因此this.value也为global var
**函数gFunc调用call方法,this默认指向第一个参数new mFunc(),即mFunc的对象,因此this.value为mFunc的成员变量member var
**函数gFunc调用call方法,this默认指向第一个参数input text控件,即id=‘idTxt’的控件,因此this.value为input控件的value值input text

更复杂一点的例子:

<script language="javascript">  
            var func = new function()  
            {  
                this.a = "func";  
            }  

            var func2 = function(x)  
            {  
                var a = "func2";  
                alert(this.a);                
                alert(x);  
            }  

            func2.call(func, "func2");        // show func and func2                  
        </script>  

**函数func2调用call方法,this默认指向第一个参数func函数对象,因此this.value为this.a,即func
**函数func2调用call方法,第二个参数属于函数对象func2的参数,因此alert(x)为第二个参数func2

apply方法:

语法:apply([thisObj[,argArray]])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

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();

animal.showName.call(cat,",");   
//animal.showName.apply(cat,[]); 

通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。

call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 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 就实现多重继承了当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法。说了call ,当然还有 apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments。代码如下:

var func=new function(){this.a="func"} 
var myfunc=function(x,y){ 
var a="myfunc"; 
alert(this.a); 
alert(x + y); 
} 
myfunc.call(func,"var"," fun");// "func" "var fun" 
myfunc.apply(func,["var"," fun"]);// "func" "var fun"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值