关于javascript:基于原型的OO有哪些优于基于类的OO?

What are the advantages that prototype based OO has over class based OO?

为什么基于类的OO如此流行而不是基于原型的OO?他们在学校教后者吗?尽管JavaScript是基于原型的,但大多数人主要是通过功能或者试图模拟基于类的系统的框架来使用它。

我知道Sun有一些关于自我的研究——关于基于原型的OO还有其他的知识来源吗?最好是能自学的东西。

我发现了一本书,里面有发表的论文:基于原型的编程:概念、语言和应用

有人读过吗?

——

所以我给了赏金,给了我最多的答案。不过,我并不十分满意。我希望听到更多的技术性的答案。也许我解释得不好。


原型继承的优点是,它可能允许以一种简单的方式进行花哨的元编程,因为原型链很容易操作。这是一个相当学术的优势,因为99%的时候元编程是错误的答案。例如,您可以有一个javascript键值观察器风格的数据操作层,其中有一个特殊的DSL,它在脱机时透明地在本地SQLite支持和通过原型交换联机时基于REST的服务器存储之间切换。我不确定这是最好的方法,但我最好能晚一点想出。在项目代码中,这并不是你通常想要做的事情,因为一旦你开始让它在多个层上运行,这种间接性就很难进行调试,但是把它保存在库中并不坏。

另一个不太有用的优点是它允许您设计自己的类系统。我说少一些帮助,因为或多或少的所有JavaScript库都有自己的不兼容的方法来处理"类"。

有很多人回答谁将继承模型与在该模型中实现的语言混合。JavaScript是动态的、弱类型的,因此很难处理,这与它是一种原型语言无关。


如果你想找人指出每一个的优点/缺点,作为他们受欢迎程度的解释,我想你会陷入一种谬论,这在技术上是非常普遍的,受欢迎程度与某种绝对的质量度量有关。

事实上,很多基于Boand类的OO很受欢迎,因为Java使用了经典的OO,而Sun花了数百万美元,并且花了很长时间建立了Java的普及度,确保人们知道它在企业中成功使用,在大学里广泛传授,并且在高中AP测试中。

原型/经典OO只是组织您想法的不同方式。可以用不支持它的语言(Python和Java实现,另一方面的JavaScript)来实现任何一种语言。

在经典的OO中,您为对象定义一个抽象的类层次结构,然后实际使用这些类的实例。在原型继承中,创建对象实例的层次结构。虽然我觉得这两个阵营都有点异端,但我不明白你为什么不能把这两个阵营混在一起…


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

我认为这与动态与静态是一样的,一个类是对象的静态定义,可以很容易地用来知道从对象中期望什么,它也有助于工具化语言以获得适当的IntelliSense支持和文档,因为您可以很容易地知道对象中的不同成员和方法是什么,另一个是Hing是一种不同的范式,它具有在对象上不显示的类中声明私有成员的能力,这在原型范式中无法实现。

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


这个问题引起了我的兴趣,所以我回去读了一些关于这个概念的原始论文。它似乎始于80年代中期的SimalTalk世界,但最终成为自我的创始原则之一。后来,JavaScript也采用了它。

论文中提出的论点是更容易学习。除了学习之外,没有任何技术上的好处。所有的论文都解释了它是如何像一种基于类的语言一样表达,但更容易学习。人们自然地以具体的方式而不是抽象的方式思考事物。我们想到了在动物园里看到的大象,而不是一般的"大象"。当我们看到其他大象时,我们把它们归类为与第一头大象不同的种类。基于原型的语言有助于这种思考。把它看作是微分编程。

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

如果有兴趣,你可以从这篇关于自我的论文开始。


http://en.wikipedia.org/wiki/prototype-based诳programming诳critics很好地解释了这一点。


我真的不想再写另一篇关于原型继承的文章,所以我将把您链接到我以前的文章。请注意,它们确实很长,但值得一读:

  • 原型继承比经典继承的好处?
  • 为什么原型继承很重要

  • 我认为区别在于动态(原型)语言提供给您的能力。JavaScript和Lisp一样,为程序员提供了几乎无限的能力。这种能力只受程序员的责任和自信程度的限制。所以讨论是老样子的,就像静态类型和无类型一样。如果你认为你的编程能力和自律能力足够强的话,那就采用原型风格吧。

    套用一句名言:

    天才做他能做的(读:基于类),天才做他想做的(读:基于原型)。