再次理解js中的call函數

a.call(b);php

網上說明的版本比較多。有的說,是指針替換。有說,將a對象的方法加在b對象執行。官方說:什麼對象替換什麼對象。反正看了幾個版本,儘管有具體的實例,看了我三次都沒看懂它的具體含義。看過仍是雲裏霧裏的。後來發現,結合實驗去理解很是好。java

 

其實,換成本身可以接受的方式理解爲好。a對象的方法應用到b對象上(函數apply的意思正好說明符合這樣理解:a對象應用到b對象上去)數組

a對象既然添加到b對象上了。那麼b對象天然就擁有了a對象全部的內容。全部,b對象就繼承了a對象了。結合本身編寫的下面代碼,理解怎麼實現繼承:app

 

function class1()框架

{函數

   this.name = function(){this

    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語言中,一個類只能有一個父類。

 

 糾正:沒作過java,java中實際上是不支持一個類繼承多個父類的。

 

 

編寫的js框架中,都會用到apply實現繼承。有個地方疑惑,作個記號!

 

 

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的第二個參數傳入,不須要轉化。

相關文章
相關標籤/搜索