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