基于原型的编程其实也是面向对象编程的一种方式。没有class化的,直接使用对象,又叫基于实例的编程,其主流的语言JavaScript, 与传统面向对象比较如下:
- 基于类的编程中,对象总共有两种类型。类定义了对象的基本布局和函数特性,而接口是"可以使用的"对象,它基于特定类的样式。此模型中,类表现为行为和结构的集合,对所有接口来说这些类的行为和结构都是相同的。
- 原型编程,基于类的语言提倡使用一个关注分类和类之间关系的开发模型。原型编程提倡程序员关注一系列对象实例的行为,而之后才关心如何将这些对象划分到最近的使用方式相似的原型对象,而不是分成类。
基于原型的系统提倡运行时进行原型的修改,而只有极少数基于类的面向对象系统,允许类在程序允许时被修改。
- 基于类的语言中,一个新的实例通过类构造器和构造器可选的参数来构造,结果实例由类选定的行为和布局创建模型。
- 基于原型的系统构造对象有两种方法,通过复制已有的对象或者通过扩展空对象创建。很多基于原型的系统提倡运行时进行原型修改,而基于类的面向对象系统只有动态语言允许类在运行时被修改。
不像基于类的面向对象语言中类和接口的关系,原型和它的分支之间的关系并不要求子对象有相似的内存结构,因为如此,子对象可以继续修改而无需像基于类的系统那样整理结构。还有一个要提到的地方是,不仅仅是数据,方法也能被修改。
这种在对象里面直接修改的玩法,虽然这个特性可以带来运行时的灵活性,我们可以在运行时修改一个prototype,给它增加甚至删除属性和方法。但是其带来了执行的不确定性,也有安全性的问题,而代码还变得不可预测。不像静态类型系统,没有一个不可变的契约对代码的确定性有保证,所以需要使用者来自己保证。