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