a.call(b); call 方法


a.call(b);

a.apply(b,[])

 

function class1()

{

   this.name = function(){

    alert("class1的方法name()");

   }

}

 

 

function class2()

{

 

class1.call(this);//要想實現class2繼承class1 this就是當前對象class2。

}

 

現在可以知道是否實現繼承了:

 

var cl = new class2();

 

cl.name();//class2繼承了class1,class2是父類。調用父類的方法

 

 

另外一種實現繼承的方式:用一個繼承函數,專門實現繼承。

 

function extend()

{

  class2.call(this);

  class1.call(this);

}

 

 

只要使用extend方法就能實現同時繼承class2 class1。從這里可以記住:js語法中,一個對象可以同時繼承兩個對象。這點跟java語言的對象機制一樣的。java語法中,對象的繼承關系,形象店,就相當於一個兒子可以同時有兩個爸爸。這確實不符合實際。不過,沒必要糾結。知道用就行了。在php語言中,一個類只能有一個父類。

 var Class = {

    create: function() {
        return function() { this.initialize.apply(this, arguments); }
    }
}

 

 

這里的arguments參數放進去是做什么用的?而且名字起好是arguments?肯定有其道理

 

注意到,call()與apply()的區別:功能一樣。第二個參數形式不一樣。call傳遞多個參數,是任意形式。apply第二個參數必須是數組形式。

用代碼來理解它們區別最好:

 

a.call(b,2,3); ==>  a.apply(b,[2,3]);//數組形式傳入

 

 

就是利用了apply參數是數組的特性。結合函數的隱性參數,都會自動保存在arguments數組中。這樣,使用apply的方式:

 

this.initialize.apply(this, arguments);

 

可以直接將當前函數的arguments數組作為apply的第二個參數傳入,不需要轉化。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM