JS中的call()和apply()方法

2018-08-11 18:10 更新

1、方法定義

call方法:

語(yǔ)法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。 說(shuō)明: call 方法可以用來(lái)代替另一個(gè)對(duì)象調(diào)用一個(gè)方法。call 方法可將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對(duì)象。 如果沒(méi)有提供 thisObj 參數(shù),那么 Global 對(duì)象被用作 thisObj。

apply方法:

語(yǔ)法:apply([thisObj[,argArray]]) 定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。 說(shuō)明: 如果 argArray 不是一個(gè)有效的數(shù)組或者不是 arguments 對(duì)象,那么將導(dǎo)致一個(gè) TypeError。 如果沒(méi)有提供 argArray 和 thisObj 任何一個(gè)參數(shù),那么 Global 對(duì)象將被用作 thisObj, 并且無(wú)法被傳遞任何參數(shù)。

2、常用實(shí)例

a、js代碼塊

    function add(a,b)  
    {  
        alert(a+b);  
    }  
    function sub(a,b)  
    {  
        alert(a-b);  
    }  

      
    add.call(sub,3,1);   

這個(gè)例子中的意思就是用 add 來(lái)替換 sub,add.call(sub,3,1) == add(3,1) ,所以運(yùn)行結(jié)果為:alert(4); // 注意:js 中的函數(shù)其實(shí)是對(duì)象,函數(shù)名是對(duì) Function 對(duì)象的引用。(其還可以看成是sub繼承了add這個(gè)方法并調(diào)用執(zhí)行)

b、js代碼塊

    function Animal(){    
        this.name = "Animal";    
        this.showName = function(){    
            alert(this.name);    
        }    
    }    

      
    function Cat(){    
        this.name = "Cat";    
    }    

       
    var animal = new Animal();    
    var cat = new Cat();    

        
    //通過(guò)call或apply方法,將原本屬于Animal對(duì)象的showName()方法交給對(duì)象cat來(lái)使用了。    
    //輸入結(jié)果為"Cat"    
    animal.showName.call(cat,",");    
    //animal.showName.apply(cat,[]);  

call 的意思是把 animal 的方法放到cat上執(zhí)行,原來(lái)cat是沒(méi)有showName() 方法,現(xiàn)在是把a(bǔ)nimal 的showName()方法放到 cat上來(lái)執(zhí)行,所以this.name 應(yīng)該是 Cat

c、實(shí)現(xiàn)繼承 js代碼塊

 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對(duì)象代替this對(duì)象,那么 Cat中不就有Animal的所有屬性和方法了嗎,Cat對(duì)象就能夠直接調(diào)用Animal的方法以及屬性了.

d、多重繼承 js代碼塊

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

很簡(jiǎn)單,使用兩個(gè) call 就實(shí)現(xiàn)多重繼承了 當(dāng)然,js的繼承還有其他方法,例如使用原型鏈,這個(gè)不屬于本文的范疇,只是在此說(shuō)明call 的用法。說(shuō)了call ,當(dāng)然還有 apply,這兩個(gè)方法基本上是一個(gè)意思,區(qū)別在于 call 的第二個(gè)參數(shù)可以是任意類型,而apply的第二個(gè)參數(shù)必須是數(shù)組,也可以是arguments 還有 callee,caller..

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)