当我主要在基于类的语言的上下文中处理OOP之后第一次开始对Javascript进行编程时,我对为什么基于原型的OOP会比基于类的OOP更为困惑。
- 使用基于原型的OOP的结构优势是什么?(例如,在某些应用程序中,我们希望它更快或更省内存吗?)
- 从编码人员的角度来看,优点是什么?(例如,使用原型制作某些应用程序或扩展其他人的代码是否容易?)
请不要把这个问题看做是关于Javascript的问题(多年来存在很多与原型无关的错误)。相反,请结合原型与类的理论优势来研究它。
谢谢。
当我主要在基于类的语言的上下文中处理OOP之后第一次开始对Javascript进行编程时,我对为什么基于原型的OOP会比基于类的OOP更为困惑。
请不要把这个问题看做是关于Javascript的问题(多年来存在很多与原型无关的错误)。相反,请结合原型与类的理论优势来研究它。
谢谢。
Answers:
在用Java编写RPG游戏时,我对这两种方法都有很多经验。最初,我使用基于类的OOP编写整个游戏,但最终意识到这是错误的方法(随着类层次结构的扩展,它变得难以维护)。因此,我将整个代码库转换为基于原型的代码。其结果是很多更好,更容易管理。
如果您有兴趣,请在此处获取源代码(Tyrant-Java Roguelike)
主要好处如下:
主要缺点如下:
最后是一些实现说明:
我必须同意@umlcat。类扩展是一个主要优势。例如,假设您想长时间为字符串类添加更多功能。在C ++中,您可以通过继续继承以前的字符串类生成来实现。这种方法的问题在于,每一代实际上都变成了自己的不同类型,这可能导致大量重写现有代码库。使用原型继承,您只需将新方法“附加”到原始基类...上,就不会在任何地方大规模构建继承类和继承关系。我希望看到C ++在其新标准中提出了类似的扩展机制。但是他们的委员会似乎由想要添加吸引人的功能和受欢迎功能的人管理。
std::string
该成员已经有太多成员,这些成员应该是独立算法,或者至少是非朋友非成员。而且无论如何,只要您可以修改原始类,就可以在不更改内存布局的情况下添加新的成员函数。