Javascript继承(下) 为何要继承2013-10-13 博客园 Justany_WhiteSnowQuiz1Javascript真的需要类(Class)么?我们首先先看下其他有类(Class)的面向对象语言(如:Java)的一些特性。父类与子类父类(Superclass)和子类(Subclass),并不是为了解决父亲与儿子的问题,而是为了解决类的包含关系的,我们用Sub表示“子类”,用Sup表示“父类”,则有: Sub Sup这是有区别的,例如通常我们能够将子类当成父类来使用,但认人的时候我们并不能把儿子当成父亲。或者可以这么说,父类和子类不是为了解决类间存在相同方法或者属性的。举个例子有人喜欢这样做:我们需要一些动物的类,以便在屏幕上创建一些移动的动物,但移动的动物有些在空中飞行,有些在路上行走。所以创建两个父类,一个是Fly,一个是Walk:
Class Fly{fly(){}}Class Walk{walk(){}}然后狮子们(还可以再建些其他的在路上行走的动物)就属于Walk类,老鹰们(也还可以再建些其他在天上飞行的动物)就属于Fly类:
Class Lion extend Walk{}Class Eagle extend Fly{}最后对Lion和Eagle类创建一些实例,调用相应的方法,屏幕上就会有一些狮子和老鹰在移动了。但这可能并不是一个好的设计,比如明天老板突然一拍大脑,他要有一种叫天马(Pegasus)的动物,它们即会在天上飞,又会在路上走,时而要飞行,时候要行走。在这种情况下,这个方案就全然无用了。为什么这个设计失败了?继承是有条件的,子类必须能严格的向上转型(变成父类)。在上面这个例子中:狮子(Lion)被假设等同于行走动物(Walk),老鹰(Eagle)被假设等同于飞行动物(Fly)。这看起来很成功,因为子类能严格向上转型,但他有隐患。当有一种天马(Pegasus)介入到里面的时候,我们才发现狮子其实只是“会行走的动物”,老鹰其实只是“会飞行的动物”,这不意味着动物一辈子只能飞行或者行走,所以即会飞行又会行走的天马就找不到自己的归属了。这个例子很好的证明了,子类和父类不是为了解决类间具有相同的方法的:一些动物都会行走,需要拥有行走(Walk)这个方法,但这不应该由子类和父类实现。