
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在学习java编程的过程中,除了需要掌握不同的代码规则以外,对于类继承等相关技术也需要掌握。今天,我们就一起来了解一下,java开发中的继承种类都有哪些。
JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承。这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑。正如我们所看到的,JavaScript的原型继承比类继承具有更强的表现力。
但首先,要搞清楚我们为什么如此关注继承?主要有两个原因。首先是方便类型的转换。我们希望语言系统能够对那些相似类的引用进行自动转换。而对于一个要求对引用对象进行显示转换的类型系统来说只能获得很少的类型安全性。这对于强类型语言来说很重要,但是在像JavaScript这样的松散型语言中,永远不需要对对象引用进行强制转换。
第二个原因是代码的复用。代码中存在大量拥有相同方法的对象是十分常见的。类可以通过一组定义来创建它们。另外存在很多相似的对象也很普遍,这些对象中只有少数有关添加和修改的方法存在区别。类的继承可以很有效地解决这些问题,但原型继承更有效。
为了说明这一点,我们将介绍一点语法糖,它允许我们以类似于传统的class的语言来编写代码。然后我们将介绍一些有用的模式,这些模式不适用于传统的class语言。最后,我们将对语法糖进行解释。
类继承
首先,我们添加了一个Parenizor类,包含set和get两个方法,分别用来设置和获取value,以及一个toString方法,用来对parens中的value进行包装。
多重继承
通过操作一个函数的原型对象,我们可以实现多重继承,从而使我们可以用多个类的方法来构建一个类。混合多重继承可能难以实现,并可能存在方法名称的冲突。我们可以在JavaScript中实现混合多重继承,但是在本例中我们将使用一个更严格的被称之为Swiss继承的形式。
假设有一个NumberValue类,包含一个方法setValue,该方法检查value是否为某个特定范围内的数字,必要的时候会抛出异常。我们只需要ZParenizor的setValue和setRange方法,而不需要toString方法。
寄生继承
ZParenizor还有另外一种写法。除了从Parenizor类继承,我们还可以在构造函数中调用Parenizor的构造函数,并传递返回的结果。通过这种方式,我们给构造函数添加特权方法,而不用再去为其添加公共方法。
类的扩充
JavaScript的动态性允许我们添加或替换现有类的方法,method方法可以随时被调用,这样类的所有实例在现在和将来都会有这个方法。我们可以在任何时候对一个类进行扩展。继承具有追溯性,我们把这个叫做类的扩充(Class Augmentation),以避免与Java的extends产生混淆。
对象的扩充
在静态面向对象语言中,如果你想要一个对象与另一个对象略微不同,就需要定义一个新的类。在JavaScript中,你可以将方法添加到单个的对象中,而不需要在定义额外的类。这个非常强大,因为你只需要写很少的类,并且类都可以很简单。回想一下,JavaScript对象就像哈希表,你可以随时添加新的值,如果值是function,那么它就成了一个方法。
结论
JavaScript可以像class语言一样来使用,但它也具有相当独特的表现力。我们研究了类的继承,Swiss继承,寄生继承,类的扩充以及对象的扩充。这种大量代码的复用模式来自于一种被认为比Java更小,更简单的语言。
类的对象非常严格,要将一个新成员添加到对象中,唯一的方法就是创建一个新类。而在JavaScript中,对象是松散的,可以通过简单的赋值操作将一个新成员添加到对象中。
由于JavaScript中的对象非常灵活,所以你需要对类的层次结构进行不同的考虑。深层次的结构并不太适用,相反,浅层次的结构更高效,更具有表现力。
作者:Jaxu
来源:博客园
【免责声明】:本内容转载于网络,转载目的在于传递最新信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。