a.call(b);
網上說明的版本比較多。有的說,是指針替換。有說,將a對象的方法加在b對象執行。官方說:什么對象替換什么對象。反正看了幾個版本,盡管有具體的實例,看了我三次都沒看懂它的具體含義。看過還是雲里霧里的。后來發現,結合實驗去理解非常好。
其實,換成自己能夠接受的方式理解為好。a對象的方法應用到b對象上(函數apply的意思正好說明符合這樣理解:a對象應用到b對象上去)
a對象既然添加到b對象上了。那么b對象自然就擁有了a對象所有的內容。所有,b對象就繼承了a對象了。結合自己編寫的下面代碼,理解怎么實現繼承:
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語言中,一個類只能有一個父類。
糾正:沒做過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的第二個參數傳入,不需要轉化。