基于原型的面向对象的基于类的面向对象的优点是什么?
为什么基于类的OO如此受欢迎,而不是基于原型的OO? 他们是否在学校教授后者? 尽pipeJavascript是基于原型的,但大多数人都是在function上使用它,或者通过尝试模拟基于类的系统的框架来使用它。
我知道Sun已经对自我进行了一些研究 – 在基于原型的oo上是否还有其他的知识来源? 最好是自学的东西。
我find了一本包含已发表论文的书: 基于原型的程序devise:概念,语言和应用程序
有没有人读过它?
–
所以我给了我最多的答案。 不过,我并不是很满意。 我本来希望听到更多的技术性的答案。 也许我没有解释得很清楚。
原型inheritance的优点是它可能允许以简单的方式进行花式元编程,因为原型链很容易被操纵。 这是一个相当学术的优势,因为元编程是99%的错误答案。 作为一个例子,你可以有一个Javascript Key-Value Observer风格的数据操作层,它具有一个特殊的DSL,可以在离线时通过本地SQLite支持和通过原型交换联机时通过基于REST的服务器存储进行透明切换。 我不确定这是做这件事的最好方法,但这是我能做到的最好的。 这不是你通常想在项目代码中做的事情,因为这种间接方式一旦开始在多个层次上进行debugging就会被debugging,但是当你把它保存在一个库中时并不坏。
另一个不太有用的优点是它允许你devise你自己的class级系统。 我说不太有帮助,因为或多或less所有的JavaScript库都有自己的一些不兼容的方法来把“类”放在一起。
有很多人回答说,他们正在将inheritance模型与在该模型中实现的语言混合在一起。 JavaScript是dynamic的,弱types的,因此很难工具化,这与原型语言无关。
如果你正在寻找某个人指出每个人的优点/缺点,作为他们受欢迎程度的解释,我认为你就是因为某种原因在技术上非常普遍的谬误 – 这个人气与某些人有关绝对的质量标准。
事实上,更平淡的类OO是受欢迎的,因为Java使用经典的面向对象,而Sun花费了数百万美元,并且很长一段时间构build了Java的stream行 – 确保人们知道它在企业中的成功使用,在大学里广泛传授,并在高中APtesting。
原型/经典的面向对象只是组织你的想法的不同方式。 你可以用本来不支持的语言来实现其中的任何一种(想到Python和Java ,而JavaScript就在另一边)。
在经典的OO中,为对象定义了一个抽象的类层次结构,然后实际上处理这些类的实例。 在原型inheritance中,您可以创build对象实例的层次结构。 虽然我觉得这两个阵营都可能有点邪道,但是我看不出有什么理由不能把两者混为一谈。
我不知道这个的确切原因,但这是我的原因
我认为这与Dynamic vs Static是一样的,一个类是对象的静态定义,可以很容易地用来知道对象期望什么,它也有助于工具语言具有适当的智能感知支持和文档,因为你可以很容易地知道对象中不同的成员和方法是什么,另外一个就是不同的范例,有能力在类中声明私有成员而不在对象上显示,这是不能在原型中完成的范例。
原型范式很好,但是它缺乏提供关于对象中的方法和成员的信息的能力,这使得工具变得更加困难,而且对于dynamictypes编程也更有意义。
这个问题引起了我的兴趣,所以我回头阅读了关于这个概念的一些原始论文。 它似乎在八十年代中期在Smalltalk世界开始,但最终成为自我的创始人之一。 以后的Javascript也采用了它。
论文中提出的论点是,学习起来比较容易。 除了学习之外,没有任何技术上的好处。 这些论文都解释了它是如同基于类的语言一样具有performance力,但是却更容易学习。 人们自然而然地以具体的方式而不是抽象地思考事物。 我们想到在动物园看到的那头大象,而不是一个普通的“大象”。 当我们看到其他的大象时,我们将它们归类为与第一个不同的地方。 基于原型的语言有利于这一思想。 把它看成是差分编程。
这是一个足够的理由使用它的语言? 也许。 在这个想法第一次开始渗透的25年里,我认为抽象的概念,例如基于课堂的面向对象,对于大多数人来说并不是很难学。 另一方面,也许需要一个蓝领程序devise语言(比如Javascript),这很容易,这可能是一种方法来实现这一点。
如果有兴趣的话,你可以从这篇关于自我的文章开始。
我真的不想再写一篇关于原型inheritance的文章,所以我只是将你链接到我以前的文章。 请注意,他们真的很长,但值得一读:
- 原型inheritance优于古典?
- 为什么原型inheritance很重要
我认为不同的是力量动力(原型)语言给你。 JavaScript和LISP一样,给程序员提供了几乎无限的权力。 这种权力只有程序员的责任和自信程度的限制。 所以讨论就像它一样古老 – 和静态打字相比,无types。 如果你认为你的编程能力和自律性足够强大 – 去原型风格。
解释一句名言:
天才做他能做的(读:基于class级),天才做他想做的(读:原型为基础)。