类式继承 vs 现代继承模式

在讨论JavaScript的继承这个话题的时候,经常会听到“类式继承”的概念,那我们先看一下什么是类式(classical)继承。classical一词并不是来自某些古老的、固定的或者是被广泛接受的解决方案,而仅仅是来自单词“class”。(译注:classical也有“经典”的意思。)

很多编程语言都有原生的类的概念,以此作为对象的蓝本。在这些语言中,每个对象都是一个指定类的实例(instance),并且(以Java为例)一个对象不能在不存在对应的类的情况下存在。在JavaScript中,因为没有类,所以类的实例的概念没什么意义。JavaScript的对象仅仅是简单的键值对,这些键值对都可以动态创建或者是改变。

但是JavaScript拥有构造函数(constructor functions),并且有语法和使用类非常相似的new运算符。

在Java中你可能会这样写:

  1. Person adam = new Person();

在JavaScript中你可以这样:

  1. var adam = new Person();

除了Java是强类型语言需要给adam添加类型Person外,其它的语法看起来是一样的。JavaScript的构造函数调用方式看起来让人感觉Person()是一个类,但事实上,Person()仅仅是一个函数。语法上的相似使得非常多的开发者陷入对JavaScript类的思考,并且给出了很多模拟类的继承方案。这样的实现方式,我们叫它“类式继承”。顺便也提一下,所谓“现代”继承模式是指那些不需要你去想类这个概念的模式。

当需要给项目选择一个继承模式时,有不少的备选方案。你应该尽量选择那些现代继承模式,除非团队已经觉得“无类不欢”。

本章先讨论类式继承,然后再关注现代继承模式。