为什么基于类的OO如此流行而不是基于原型的OO?他们在学校教后者吗?尽管JavaScript是基于原型的,但大多数人主要是通过功能或者试图模拟基于类的系统的框架来使用它。
我知道Sun有一些关于自我的研究——关于基于原型的OO还有其他的知识来源吗?最好是能自学的东西。
我发现了一本书,里面有发表的论文:基于原型的编程:概念、语言和应用
有人读过吗?
——
所以我给了赏金,给了我最多的答案。不过,我并不十分满意。我希望听到更多的技术性的答案。也许我解释得不好。
- developer.mozilla.org JavaScript /指南/ & hellip;
- "不"的结局吗?我summarise有趣的纸。在一nutshell,基于类的世界观的执行flawed是更多比一个原型。因此,我们需要小心。这里是总结:carnotaurus.tumblr.com /邮件/ 3248631891 / & hellip;
- 基于面向对象的类的原型是基于面向对象的historically之前,as a result,现在是在广泛使用的,在世界上大多数的代码输出。的概念已被证明有impractical降临,直到大学的JavaScript。基于面向对象的原型期望学校教会的金额写在代码样式"在世界上。我的答案下面将面向对象与基于动态原型的继承。
- 因此,语言agnostic湖-什么是真实的原型为基础的面向对象的基于类的面向对象的过吗?在programmers.se
原型继承的优点是,它可能允许以一种简单的方式进行花哨的元编程,因为原型链很容易操作。这是一个相当学术的优势,因为99%的时候元编程是错误的答案。例如,您可以有一个javascript键值观察器风格的数据操作层,其中有一个特殊的DSL,它在脱机时透明地在本地SQLite支持和通过原型交换联机时基于REST的服务器存储之间切换。我不确定这是最好的方法,但我最好能晚一点想出。在项目代码中,这并不是你通常想要做的事情,因为一旦你开始让它在多个层上运行,这种间接性就很难进行调试,但是把它保存在库中并不坏。
另一个不太有用的优点是它允许您设计自己的类系统。我说少一些帮助,因为或多或少的所有JavaScript库都有自己的不兼容的方法来处理"类"。
有很多人回答谁将继承模型与在该模型中实现的语言混合。JavaScript是动态的、弱类型的,因此很难处理,这与它是一种原型语言无关。
- 使用JavaScript的实现,您不能切换原型对象是什么。它是否只是对实际原型对象本身从sqlite更改为rest?
- 对。如果您正在通过save()函数进行所有的欺骗,那么您将用rest save()替换sqlite save():>>>rest save=function()return"rest">>>sql save=function()>>storage=function()/*初始化等*/>>storage.prototype.save=rest save>>my _obj=new storage()>>>my _obj.save()"rest">>storage.prototype.save=sql_save function()>>>my_obj.save()"sql"通过使用所有主要JS库中可用的更新/合并函数,可以轻松地对整个对象执行此操作。不是"真"交换,但它可能有用。
- 我讨厌这些评论中没有新行。
- JavaScript不是弱类型的,它是强类型的。你与动态混合弱…
- E.WiKiTo.Org/Wik/ViuxType ->绝对弱类型。它也在描述中:En.WijiTo.Org/WiKi/JavaScript。我认为您混淆了这样一个事实:您可以同时使用动态和弱类型语言,这就是JS。它绝不是强类型的。
如果你想找人指出每一个的优点/缺点,作为他们受欢迎程度的解释,我想你会陷入一种谬论,这在技术上是非常普遍的,受欢迎程度与某种绝对的质量度量有关。
事实上,很多基于Boand类的OO很受欢迎,因为Java使用了经典的OO,而Sun花了数百万美元,并且花了很长时间建立了Java的普及度,确保人们知道它在企业中成功使用,在大学里广泛传授,并且在高中AP测试中。
原型/经典OO只是组织您想法的不同方式。可以用不支持它的语言(Python和Java实现,另一方面的JavaScript)来实现任何一种语言。
在经典的OO中,您为对象定义一个抽象的类层次结构,然后实际使用这些类的实例。在原型继承中,创建对象实例的层次结构。虽然我觉得这两个阵营都有点异端,但我不明白你为什么不能把这两个阵营混在一起…
- 我只是好奇是否有一些东西使得基于原型的OO对开发人员来说更具挑战性。主要是想知道在创建复杂的软件时会遇到什么样的问题。我不是说大众化是基于范式的质量,但这可能是原因所在。
- 我想知道什么是经典的OO?它是否像SimalTalk和CoLs(它是PopopType),还是Simula(它类似于Java基于对象的)?哪一款真的很经典?
- 抱歉,经典的说法是,我指的是课堂教学。
- 伊加:不,我不认为困难有什么不同,只是暴露的不同。基于班级的OOP在美国所有高中/大学CS课程中授课。
- 但我所追求的是,基于原型的面向对象教学在哪里?如果是这样的话,我会对讨论如何以这种方式设计程序的材料感兴趣。
- 基于原型是危险的,同样的原因是它的强大,你可以在任何时候修改任何东西,它影响到所有东西。这是反对全局变量的老论点,你永远不知道谁掌握了什么。因此,你必须非常小心不要踩到任何人的脚趾,但它允许你做一些在其他语言中非常困难或不可能做的事情(可以说是有充分的理由的)。
- @Egaga:我建议阅读一些关于CLOS(公共Lisp对象系统)的资料。它将使您正确理解基于原型的编程以及函数式编程。它们都非常适用于JavaScript。只有一个事实:用JavaScript编写的几乎完整的Lisp解释器需要大约100行代码。这两种语言几乎是可逆的。
- @奥克莱夫:那完全无关。不真实。例如,在ECMAScript5中,您将能够"冻结"对象,确保以后不会修改它们。@伊加加:我只在罗格斯大学读过本科生,那里没有人教任何接近原型遗传的东西(而且有充分的理由——在大学教室里有更难教的东西,次要的语言范例可以(也应该)自己学习)。
- 顺便说一句,古典OO根本不是关于层次结构的,而是关于消息传递的(根据创造这个术语的Alan Kay所说):lists.squakfoundation.org/pipermail/squak dev/1998年10月‌&8203;/…(来自基于原型OO的讨论)。
- 在基于类的系统之上实现一个基于原型的系统,在大多数情况下,对于大多数语言来说,效率极低。然而,反过来往往是不正确的。
我不知道确切的原因,但这是我的原因
我认为这与动态与静态是一样的,一个类是对象的静态定义,可以很容易地用来知道从对象中期望什么,它也有助于工具化语言以获得适当的IntelliSense支持和文档,因为您可以很容易地知道对象中的不同成员和方法是什么,另一个是Hing是一种不同的范式,它具有在对象上不显示的类中声明私有成员的能力,这在原型范式中无法实现。
原型范式很好,但是它缺乏提供关于对象中方法和成员的信息的能力,这使得工具更加困难,而且对于动态类型编程也更有意义。
- 马上就来。静态语言需要类,以便编译器知道期望/不允许什么。动态语言不需要它们,所以使用原型更方便。
- 同意。然而,请注意,虽然JavaScript本机支持基于原型的继承,但使用闭包实现一些OO特性并不困难。例如,您可以很容易地得到私有方法和变量的真正保护。达斯汀·迪亚兹关于这个主题的书是一流的:"pro-javascript设计模式"(jsdignpatterns.com)。这一点表明,使用这种动态语言的工具是困难的。有了这样一种灵活的语言(如javascript),开发环境很难知道您使用的是什么继承模式。
- 我不同意"基于原型的缺乏提供关于对象中方法和成员的信息的能力"。与基于类的相反,它很容易在运行时枚举。
- 此外,在基于原型的语言中,您可以将代码解释为数据,将数据解释为代码。这比基于静态类的语言有很大的优势。这就是为什么大多数JavaScript程序与建议的ECMA 4标准中的静态类引入相反。
- 实际上,编写一个静态类型的原型语言是可能的。
这个问题引起了我的兴趣,所以我回去读了一些关于这个概念的原始论文。它似乎始于80年代中期的SimalTalk世界,但最终成为自我的创始原则之一。后来,JavaScript也采用了它。
论文中提出的论点是更容易学习。除了学习之外,没有任何技术上的好处。所有的论文都解释了它是如何像一种基于类的语言一样表达,但更容易学习。人们自然地以具体的方式而不是抽象的方式思考事物。我们想到了在动物园里看到的大象,而不是一般的"大象"。当我们看到其他大象时,我们把它们归类为与第一头大象不同的种类。基于原型的语言有助于这种思考。把它看作是微分编程。
这是否是在语言中使用它的充分理由?也许。在这个想法开始渗透的25年里,我认为抽象概念,如基于类的OO,对大多数人来说并不难学习。另一方面,可能需要一种蓝领编程语言(如javascript),这种语言更容易实现,这可能是实现这一点的一种方法。
如果有兴趣,你可以从这篇关于自我的论文开始。
http://en.wikipedia.org/wiki/prototype-based诳programming诳critics很好地解释了这一点。
我真的不想再写另一篇关于原型继承的文章,所以我将把您链接到我以前的文章。请注意,它们确实很长,但值得一读:
原型继承比经典继承的好处?
为什么原型继承很重要
我认为区别在于动态(原型)语言提供给您的能力。JavaScript和Lisp一样,为程序员提供了几乎无限的能力。这种能力只受程序员的责任和自信程度的限制。所以讨论是老样子的,就像静态类型和无类型一样。如果你认为你的编程能力和自律能力足够强的话,那就采用原型风格吧。
套用一句名言:
天才做他能做的(读:基于类),天才做他想做的(读:基于原型)。
- 但你所说的这种力量是什么?这就是我想要的。
- 主要是用脚射自己的力量。静态类型(和类似的类)是一种试图将程序员从自己身上拯救出来的方法。这是一种故意让危险的事情更难做的语言。只需使用非静态类型和基于原型的面向对象系统,您就可以完成令人惊奇的事情,但是您也可以做一些非常糟糕的事情。
- 它是在程序中生成任何可想象的构造的能力。它只受你幻想的限制。有时候幻想可能已经够恶心了。)
- 我真的很喜欢这个答案,尽管它不是很专业。它以一种时尚的方式很好地概括了整个事情=)
- @奥克莱夫:为什么程序员必须"自救"?要么你是程序员,要么你不是。:)你要么对你的工作负责,要么不负责。
- 是的,我也这么认为,我喜欢基于原型的OO,但同时(特别是在公司情况下),即使你可能会写适当的代码,你身边的人可能不会,在这种情况下,给糟糕的代码设置一些障碍并不一定是件坏事。当然,理想情况下,编写可怕代码的白痴会被解雇,但我们有时也会看到这种情况。