在网上看到一段关于用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方式调用父类的构造函数。那么子类就可以继承父类的属性,方法。但子类和父类中的属性会因为顺序而相互覆盖。所以要做到“子类中有的,用子类的,没有的就用父类的”这点,就把父类的构造的函数尽量放在子类构造函数内部的前面。