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是动态的,弱类型的,因此难以使用工具与它是一种原型语言无关.
And*_*rov 19
如果你正在寻找某人指出每个人的优点/缺点作为他们受欢迎程度的解释,我认为你的谬误是由于某种原因在技术上非常普遍 - 这种谬论与某些人有关绝对的质量衡量标准.
真相是更加平淡 - 基于类的OO很受欢迎,因为Java使用经典的OO,而Sun花费了数百万美元并且花了很长时间来建立Java的流行 - 确保人们知道它在公司中成功使用,在大学中广泛传授,以及高中AP测试.
原型/经典OO只是组织您的想法的不同方式.您可以在本机不支持它的语言中实现其中任何一种(想到Python和Java,另一方面使用JavaScript).
在经典OO中,您为对象定义了类的抽象层次结构,然后实际使用这些类的实例.在原型继承中,您可以创建对象实例的层次结构.虽然我想在两个阵营中都可能有点异端,但我没有看到你不能混淆这两个阵营的理由......
bas*_*des 12
我不知道确切的原因,但这是我的理由
我认为这与动态与静态相同,类是对象的静态定义,可以很容易地用来知道对象的期望,它还有助于使语言工具具有适当的智能感知支持和文档,因为你可以很容易地知道对象中有哪些不同的成员和方法,另一件事就是能够在类中没有显示私有成员的不同范例,这不能在原型中完成范例.
原型范例很好,但它缺乏提供有关对象中方法和成员的信息的能力,这使得工具更难,而且对于动态类型编程也更有意义.
Ste*_*owe 10
这个问题让我很感兴趣,所以我回过头来阅读一些关于这个概念的原始论文.它似乎始于20世纪80年代中期的Smalltalk世界,但最终成为Self的创始人之一.很久以后Javascript也采用了它.
论文中提出的论点是,它更容易学习.除了学习之外,确实没有提出任何技术好处.这些论文都解释了它是如何像基于类的语言一样表达,但更容易学习.人们自然而然地以具体方式而不是抽象地思考事物.我们想到了我们在动物园看到的大象,而不是通用的"大象".当我们看到其他大象时,我们将它们归类为与第一个大象的差异.基于原型的语言促进了这种思考.把它想象成差分编程.
这是在语言中使用它的充分理由吗?也许.自从这个想法首次开始渗透以来的25年里,我认为像基于类的OO这样的抽象概念对于大多数人来说并不是太难学习.另一方面,也许需要一种更容易的蓝领编程语言(如Javascript),这可能是实现这一目标的一种方式.