基于原型的OO具有超过基于类的OO的优势是什么?

时间:2009-05-18 18:14:36

标签: javascript oop class programming-languages selflanguage

为什么基于类的OO如此受欢迎而不是基于原型的OO?他们是否在学校教授后者?虽然Javascript是基于原型的,但大多数人主要使用它,或者通过试图模拟基于类的系统的框架。

我知道Sun已经对Self进行了一些研究 - 基于原型的oo还有其他任何知识来源吗?最好是可以自学的东西。

我找到了一本包含已发表论文的书:Prototype-Based Programming: Concepts, Languages and Applications

有人看过吗?

-

所以我给了我最大的回答。不过,我真的不太满意。我本来希望听到更多技术性的答案。也许我没有很好地解释自己。

7 个答案:

答案 0 :(得分:23)

原型继承的优势在于它可能以简单的方式允许花哨的元编程,因为原型链很容易被操纵。这是一个相当的学术优势,因为元编程在99%的时间里是错误的答案。例如,您可以拥有一个Javascript键值观察器样式数据操作层,其中包含一个特殊的DSL,它在离线时本地SQLite后备和基于REST的服务器存储之间通过原型交换在线进行透明切换。我不确定这是最好的方法,但这是我能想到的最好的方法。这并不是你通常想要在项目代码中做的事情,因为这种间接是一旦你开始在多层上进行调试就会调试,但是当你将它保存在库中时它就不错了。

另一个不太有用的优点是它允许您设计自己的类系统。我说的帮助不大,因为或多或少所有的javascript库都有自己的“类”组合方式略有不兼容的方法。

有很多人回复将继承模型与该模型中实现的语言混合在一起。事实上,javascript是动态的,弱类型的,因此很难用工具与它是一种原型语言无关。

答案 1 :(得分:19)

如果你正在寻找某人指出每个人的优点/缺点作为他们受欢迎程度的解释,我认为你是因为某种原因在技术上非常普遍的谬论而堕落 - 做一些绝对的质量测量。

事实是更加平淡 - 基于类的OO很受欢迎,因为Java使用经典的OO,而Sun花费了数百万美元并且花了很长时间来建立Java的流行 - 确保人们知道它在公司中成功使用,教广泛的大学和高中AP测试。

原型/经典OO只是组织您的想法的不同方式。您可以使用本机不支持的语言实现其中任何一种(PythonJava,另一方面JavaScript

在经典OO中,您为对象定义了类的抽象层次结构,然后实际使用这些类的实例。在原型继承中,您可以创建对象实例的层次结构。虽然我想在两个阵营中都可能有点异端,但我没有看到你不能混淆这两个阵营的理由......

答案 2 :(得分:12)

我不知道确切原因,但这是我的理由

我认为这与动态与静态相同,类是对象的静态定义,可以很容易地用来知道对象的期望,它还有助于使语言工具具有适当的智能感知支持和文档,因为你可以很容易地知道对象中的不同成员和方法是什么,另一个是能够在类中声明私有成员而不在对象上显示的不同范例,这是不可能完成的在原型范例中。

原型范例很好,但它缺乏提供有关对象中方法和成员的信息的能力,这使得工具更难,而且对于动态类型编程也更有意义。

答案 3 :(得分:10)

这个问题引起了我的兴趣所以我回去看了一些关于这个概念的原始论文。它似乎始于20世纪80年代中期的Smalltalk世界,但最终成为Self的创始人之一。很久以后Javascript也采用了它。

论文中提出的论点是,它更容易学习。除了学习之外,确实没有提出任何技术好处。这些论文都解释了它是如何像基于类的语言一样表达,但更容易学习。人们自然而然地以具体方式而不是抽象地思考事物。我们想到了我们在动物园看到的大象,而不是通用的“大象”。当我们看到其他大象时,我们将它们归类为与第一个大象的差异。基于原型的语言促进了这种思考。可以把它想象成差分编程。

这是在语言中使用它的充分理由吗?也许。自从这个想法首次开始渗透以来的25年里,我认为像基于类的OO这样的抽象概念对于大多数人来说并不是太难学习。另一方面,也许需要一种更容易的蓝领编程语言(如Javascript),这可能是实现这一目标的一种方式。

如果有兴趣,可以从关于自我的this paper开始。

答案 4 :(得分:6)

答案 5 :(得分:4)

我真的不想再写一篇关于原型继承的文章,所以我只想把你链接到我以前的文章。请注意,它们非常长但值得一读:

  1. Benefits of prototypal inheritance over classical?
  2. Why Prototypal Inheritance Matters

答案 6 :(得分:3)

我认为差异在于动力(原型)语言给你的。 Javascript与LISP一样,为程序员提供了几乎无限的权力。这种权力只受到程序员的责任和自信心的限制。因此讨论与现在一样古老 - 与静态类型与无类型相同。如果你认为你的编程能力和自律能力足够强大 - 那就去做原型风格。

解释一句名言:

天赋尽其所能(阅读:基于类),天才做他想做的事(阅读:基于原型)。