Javascript继承(下) 为何要继承

2014-06-09
浏览
导读:Quiz1 Javascript真的需要类(Class)么? 我们首先先看下其他有类(Class)的面向对象语言(如: Java)的一些特性。 父类与子类 父类(Superclass)和子类(S

Quiz1

Javascript真的需要类(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)这个方法,但这不应该由子类和父类实现。

js代码实现轮播图

js实现上传按钮并显示缩略图小轮子

js实现无缝轮播图特效

Node.js API详解之 os模块用法实例分析

详解react组件通讯方式(多种)