基于原型的OO有哪些优于OO的优势?

ega*_*aga 42 javascript oop programming-languages class selflanguage

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

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

我找到了一本包含已发表论文的书:基于原型的编程:概念,语言和应用

有人读过吗?

-

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

Kar*_*tin 23

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

另一个不太有用的优点是它允许您设计自己的类系统.我说没那么有用,因为或多或少所有的javascript库都有自己的略有不兼容的方法来解决"类"的组合问题.

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

  • 我讨厌这些评论中缺少新行. (10认同)
  • JavaScript不是弱类型,它是强类型的.你混淆与动态...... (2认同)
  • http://en.wikipedia.org/wiki/Weak_typing - >绝对弱类型.它也在描述中:http://en.wikipedia.org/wiki/JavaScript.我认为_你在混淆这样一个事实,你可以同时拥有一个动态的和弱类型的语言,这就是JS.它绝不是强类型的. (2认同)

And*_*rov 19

如果你正在寻找某人指出每个人的优点/缺点作为他们受欢迎程度的解释,我认为你的谬误是由于某种原因在技术上非常普遍 - 这种谬论与某些人有关绝对的质量衡量标准.

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

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

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

  • 基于原型是危险的,因为它是强大的,你可以随时修改任何东西,它会影响一切.这是反对全球变量的旧论据,你永远不知道谁掌握了什么.因此,你必须非常小心,不要踩到任何人的脚趾,但它允许你做一些在其他语言中极其困难或不可能的事情(可以说有充分理由). (2认同)

bas*_*des 12

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

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

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

  • 我不同意"基于原型的缺乏提供有关对象中的方法和成员的信息的能力".与基于类的反对,它很容易在运行时枚举. (4认同)
  • 就在.静态语言需要类,以便编译器知道期望/不允许的内容.动态语言不需要它们,因此使用原型更方便. (2认同)

Ste*_*owe 10

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

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

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

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


Aad*_*hah 5

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

  1. 原型继承比经典继承有什么好处?
  2. 为什么原型继承很重要