类和模块
在 JS 中,每个对象都是一组属性的集合,各个对象是互不相同的。也可以为共享一批属性的一组对象定义一个“类”,类的成员,或者说实例(也就是对象)拥有自己特有的属性来保存自身的状态,另外还有一些属性用来定义自身的行为——方法,所有的实例共享这些行为。假设有一个 Complex 类表示复数,同时还定义了复数运算。那么 Complex 的实例就可以在属性中保存复数的实部和虚部(状态),同时 Complex 类还可以定义复数的加法和乘法(行为)。
在 JavaScript 中,类是通过原型继承机制实现的。如果两个对象从同一个原型对象上继承属性,那么它俩是同一个类的实例。
如果两个类继承同一个原型,一般来说它俩是由同一个构造函数所创建和初始化的。
如果熟悉 Java 或者 C++ 之类的强类型语言的话,你就会发现 JavaScript 的类和这些语言的大不一样。两者之间在语法上是有些相似,JavaScript 也可以模拟经典的类的特性,但是对于 JavaScript 的类及其基于原型的继承机制,以及 Java 的类及其基于类的继承机制来说,一定要理解这两者是完全不同的。
JavaScript 中的类的一个重要特性就是可以动态扩展,后面的小节会深入探讨。类也可以看做是一种类型,就像字符串、数字、对象那样,有好几种方法可以确定对象属于哪种类型。另外本章还会介绍一种编程哲学——鸭式辩型,它弱化了对象的类型,强调类的功能。
编写模块化的、可重用的代码有很多种方式,定义类就是其中之一。本章最后一节会专门讨论 JavaScript 中的模块。