在網上看到一段關於用apply方法實現js類中的繼承。代碼 如下
在子類的構造函數中,對父類的構造函數應用apply方法,就可以實現繼承。很像Java,c++中的繼承---在子類的構造函數中調用父類的構造函數。
在調用Derive類的ChineseName屬性時,Derive類是沒有這個屬性的(被註釋掉了),程序沒有出現異常,顯示的是Base類的ChineseName屬性值。
在調用Derive類的BaseMethod方法時,也是調用繼承Base類的BaseMethod方法。apply方法都知道是改變調用函數的上下文,也就是函數中的隱含參數---this。這樣的話,調用Derive類的BaseMethod方法時,函數內部用到了“this.ChineseName ”。此時的“this”,是否已經指向Derive類的對象--O,應該是,但Derive類沒有 ChineseName屬性,程序顯示的是Base類ChineseName屬性值,當在
Derive類內增加 ChineseName屬性後,程序可以顯示Derive類的對象的 ChineseName屬性,這也就很像高級語言中的繼承特性了,
子類中有的,用子類的,沒有的就用父類的。
但在這有個前提,就是Base.call(this, EnglishName)要放在Derive類構造函數的前面(最好第一行)。如果將Base.call(this, EnglishName)放在Derive類ChineseName屬性後,即使子類中有這個屬性,也不會顯示還是現實父類的同名屬性。
可能解釋是,在子類的構造函數中以apply方式調用父類的構造函數。那麼子類就可以繼承父類的屬性,方法。但子類和父類中的屬性會因爲順序而相互覆蓋。所以要做到“子類中有的,用子類的,沒有的就用父類的”這點,就把父類的構造的函數儘量放在子類構造函數內部的前面。