原型 VS jQuery - 优势和劣势?

64

我不想再开一个"又一个Js VS Js"的讨论帖。

我猜,Prototype和jQuery最终都是JS,并且几乎具有相同的方法和函数,执行相同任务需要几乎相同的代码行数。

对于一个真正的富互联网应用程序,在Prototype和jQuery之间,哪些是真正的优势,哪些是弱点?


4
我们已经有几个关于这个问题的重复了(请参见此搜索)。而这个特定的问题则非常主观和争议性。该如何投票? 注:原文中的"duplicates"指的是相同或类似的问题,"subjective and argumentative"意为主观和争论性强。 - Jørn Schou-Rode
2
当期望别人花时间回答你的问题时,基本的拼写和语法检查可以帮助你走得更远。 - Yarin
2
@Yarin:一旦您达到足够的声望来编辑他人的帖子,请随意编辑语法错误并检查所有拼写!谢谢... ;) - Luca Filosofi
可能是Is there any reason to prefer Prototype to JQuery?的重复问题。 - Nate
14个回答

105

一开始我喜欢Prototype的想法,即使用新的或修改过的方法扩展元素。

然而,我发现了许多原因,这是一个“坏事(TM)”

如果你做一些搜索,你可能会找到其他一些原因,但主要原因是Prototype不能保证与其他框架或库“友好相处”,因为其他库期望元素和方法的行为是“标准”的,并由于Prototype做的事情,你可能会发现一些问题被它弄坏了。

我最近发现的一个例子是Prototype在JSON和stringify方面出了问题。我正在使用EasyXDM,在加载prototype.js库的某些情况下,它根本不起作用。因为我正在编写一个供“他人”使用的框架,因此无法控制页面内容,所以我需要在IFRAME中创建和执行所有操作,以确保诸如prototype.js之类的东西不会破坏我所做的事情。

...所以对我来说,jQuery是首选,因为我认为一个框架自动干扰DOM和javascript的标准行为是不正确的。你应该掌握这些事情,Prototype夺走了你的一些控制权...


13
我应该补充一下,在有限的情况下,如果您完全控制页面,不依赖其他库等,Prototype可以简单易行地完成某些任务(我特别喜欢absolutize()方法)。但是,我认为它不是一个“默认”的框架,您可以随时使用,而jQuery和其他不太具有侵入性的库则非常安全(我特别喜欢.noConflict()方法-所有我的jQuery内容都是使用$j而不是$完成的,通过使用window.$j = jQuery.noConflict();)。 - Graza
1
@Sean - 没有使用最新版本 - 我本来有几个“补丁”要发送给你,但当我回到你的网站时,它似乎(从代码上看,而不是从测试中)这些问题在最新版本中已经解决了。其中一个问题是如果ENDPOINT包含查询字符串(例如,如果hash.html或其功能的实现具有类似于//some.domain/some.script?page=easyXDMhash&someOtherValueName=someOtherValue的URI),就会出现问题。话虽如此 - 虽然您的框架处理Prototype,但其他一些框架则不是(因此我仍然不喜欢Prototype的做法)。 - Graza
如果您不介意的话,能否将修补后的文件或这些问题的描述发送给我(至少那些您不能肯定已经被修复的)?可能有一些使用情况是我没有预见到的 :) - Sean Kinsey
我喜欢原型中的bind(),而jQuery没有它,因为它强制所有东西都是“模块化”的。但有时这样做就像用大锤子敲钉子。我也喜欢原型返回(好吧,我知道它被扩展了)DOM元素而不是jQuery对象。尽管这个答案非常好地指出了原型的主要缺陷。 - HenchHacker
@Graza是由Prototype引起的冲突还是Prototype和EasyXDM都有责任?你没有详细说明,所以我只能假设是因为Prototype和EasyXDM都使用了相同的“类”和相同的函数而导致了冲突。例如,两者都可能在“Element”上定义了hide。后加载的库将覆盖前一个库的功能,导致前一个库无法按预期工作。在这种情况下,两个库都有责任。那么如果您已经认为Prototype不好,为什么要使用另一个不好的库呢? - JoJo
显示剩余6条评论

45
我也更喜欢用jQuery,只需要看看本页面顶部就知道为什么:

jquery tagged questions : 531,752
prototype tagged question : 2,465
更新于2014年9月22日,2011年12月14日时的数据:jQuery - 135,641条 / prototype - 2,327条

jQuery代码简练明了。我觉得Prototype则更加冗长,虽然在许多功能上与jQuery相当。但是,如果你需要帮助入门,那你就需要更大的社区。有更多的支持、已经回答过同样问题的问题列表可以轻松搜索,以及更多的插件,你可能正在寻找执行某些操作的代码...已经被编写好了。
出于同样的原因,社区越大,代码越复杂,这意味着已经编写了简单的代码和解决了许多复杂的情况。如果你正在编写一个非常丰富的应用程序,你很可能会遇到一些非常复杂的问题或情况......有更多的资源可以帮助你处理这些问题。
同样基于社区规模的原因,人们发现了框架中的更多缺陷并填补了这些空白,因为更大的社区正在对其进行审查。这意味着,当你遇到一个问题时,很可能有其他人也遇到过同样的问题,并添加了某种方法或选项来帮助你继续前进,而不是因为碰到框架无法处理的问题而被卡住。

24
问题数量并不代表任何意义。它可能意味着jQuery需要更多的问题才能被理解和使用,或者主要由经验不足/技能不佳的人使用...总之,这与问题本身无关。 - Alsciende
26
@Alsciende - 给我展示任何一个SO上活动量近三十倍却社区规模较小的主题...这与问题直接相关,对于jQuery vs prototype有更多的答案。 社区规模很重要,问题数��只是一个直观的例子。如果prototype有一个更大的社区,他们的发布计划就不会那么长了...而且由于2.0版本由于DOM问题通过整个模型的工作方式引入了语法变化...我会说jQuery选择了一条更好的道路,并因此在使用中飞速发展。 - Nick Craver
2.0?原型稳定版本是1.6,RC版本是1.7。原型选择扩展js原型并且从未回头。jQuery选择了不同的道路,并且从未回头。不同的需求,不同的方法,都没有对错之分。不要偏执地坚持一种观点。 - Alsciende
2
@Alsciende - “从未回头”...我完全不同意,主要是因为原型核心团队的成员也有相反的看法,这里有一个人回顾了2.0版本并讨论了其中的问题:http://perfectionkills.com/whats-wrong-with-extending-the-dom/ - Nick Craver
2
仅仅看一个框架被问了多少问题并不能说明这个框架有多好——事实上,情况可能恰恰相反。因为一个更加复杂或者设计不良、文档不全的框架会导致出现更多的问题! - HenchHacker

19

我目前正在重写应用程序的大块内容,从Prototype转移到jQuery。为什么?插件、插件、插件,尤其是UI小部件。Prototype UI元素相当零散且非常零碎,而jQuery拥有非常丰富的“标准”元素


这就是我想念原型的地方 :( 尽管我发现原型(和 scriptaculous) 对我来说工作得很好,因为我只使用了少量的效果、选择器和ajax。从对原始JS有很好的掌握,原型扩展它比必须正确学习jQuery的方法更容易处理(因为它返回一个对象本身,然后你需要使用方法,而不是原始JS)。如果我要做一些涉及原型或需要大量额外内容(如lightbox等)的事情,那么jQuery就是最好的选择。 - HenchHacker

13

JQuery旨在使网页添加花哨特效变得容易。它已经达到了100%的成功率。

由于人们通常需要和要求从Javascript库中添加动画和偶尔的ajax调用,因此JQuery拥有庞大的社区。JQuery的座右铭是“我将添加一些闪光效果,并离开”,这正是我们开发者经常需要的。

然而,Prototype在大多数其他用例中表现出色。它具有稳定的基于类的OOP框架(统一解决继承构造函数等问题),以及一套良好的通用抽象来处理数据。


我不会因为我是一个认真的人而对此进行投票否决。顺便说一句:"少写代码,多做事"。 - Luca Filosofi
10
@aSeptik问关于在制作RIA时使用Prototype和jQuery的实际经验。您没有提到赞扬jQuery并批评Prototype的重点。通常情况下,JavaScript用于操作DOM、添加效果、执行一些ajax(更多读取,较少写入)。这就是jQuery优越的地方,它的设计非常适合这些情况。但对于更大型的RIA,您可能需要生成复杂的JSON,通过构建类(也许使用继承?)来模块化您的代码等等。在这里,jQuery无法帮到您,而Prototype会有所帮助。这就是为什么您想要投票反对我的原因吗?PS:“不作恶”。 - fdreger
2
+1 - 这是我读到的第一个提到面向对象编程中原型优势的答案 ;) - HenchHacker

9

我选择jQuery而不是Prototype,因为:

  • 它有"做更多的事情,写更少的代码"的特点
  • jQuery社区更大(因此有更多的插件和资源)

6
我两者都用过并且都喜欢。它取决于你的项目需求。对我来说,看起来这两个平台是因为不同的要求而从两个不同的方向出发。它们都是根据需要创建的,以便更快更好地构建网站/应用程序。
当使用标准工具箱快速制作网站时,jquery及其库非常好用。没有重新发明轮子的必要。然而,当我的工具/技巧无法使用时,我会遇到奇怪的浏览器版本问题,并且总是发生在客户端拥有该特定版本的情况下。通常在浏览器版本发布/更新时会发生这种情况。所以,我必须去获取新版本的jquery库文件来更新所有的站点,前提是社区已经注意到并解决了这个问题。这是我唯一的抱怨,因为我没有时间自己解决它。虽然不经常发生,但确实会发生。
在处理更复杂的Web项目时,可能是由后端API支持的网站网络,我发现prototype很棒。我充分利用服务器端OO编程,并且非常高兴自己可以使用相同的方法来完成Prototype。我感觉我的应用程序更有“控制力”,可以快速修复问题,因为我是作者。我确实听到人们对开销、DOM扩展等问题的抱怨,但我没有遇到任何大问题(碰木头)。此外,没有“for each”语句的整个问题并不是一个问题,因为我可以使用.each(function(){},..)同样容易地迭代相同的变量并具有更多控制力。
因此,每种都有它自己的位置,你必须选择适合自己的工具。

4

没有哪一个是“最好的”。这都取决于具体情况。尝试使用它们两个,看看哪一个更适合您。我个人使用jQuery,因为它更易于使用,而Prototype则相对先进,学习曲线较长。

可以看一下:

Prototype vs JQuery (at Ajaxian)


1
学习了jQuery、Prototype和原始JS后,我会诚实地说,情况恰恰相反。jQuery很烦人,因为它不停地返回一个jQuery对象(这意味着您必须学习jquery对象的方法才能正确使用它),而Prototype则返回一个扩展的dom元素,所以例如innerHTML仍然有效。劣势是跨浏览器兼容性,但对于原型来说,学习曲线仍然较小。此外,原型的bind()方法不像jQuery那样强制您做到一切都是模块化的(还有其他要学习的东西)。 - HenchHacker
虽然我想说 - 最后一条评论仅从学习曲线的角度来看。jQuery 强制执行两个好处 - 通过返回 jQuery 对象并仅使用其方法有助于跨浏览器脚本编写和以模块化方式编码不是坏事 ;) 虽然这两者都需要比 prototype 更多的学习。 - HenchHacker
我曾长期使用原型,现在我一直在使用jQuery。我认为原型并不比jQuery更先进。 - ehsun7b
这是一个很棒的链接,虽然它已经有些年头了。我简直不敢相信我以前从未见过它。我会与我的合作开发人员分享这个链接。 - isherwood

3

这是一篇关于jQuery和MooTools的有趣文章(至少在这场争论中,MooTools和Prototype基本可以互换):http://jqueryvsmootools.com/


1
"MooTools是一个框架,旨在按照MooTools作者的想法实现JavaScript。其目标是实现一个感觉像JavaScript并增强所有内容的API,而不仅仅是DOM。jQuery是一个工具包,为您提供了一套易于使用的方法集合,以自包含系统的形式设计,使DOM本身更加愉悦。恰好DOM是大多数人在编写JavaScript时关注的重点,因此在许多情况下,jQuery就是您所需要的。或许Prototype也更像一个框架。这里的大多数人似乎更喜欢这个工具包。" - user1499731

3

jQuery使用基于CSS语法的CSS样式选择器和过滤器。从设计角度来看,这有很多好处。我非常喜欢并精通CSS,所以个人而言,jQuery对我来说非常自然。如果您正在寻找一种语法,使得您的整体编码体验更加愉快,并且您是CSS的忠实粉丝/专家,可以肯定地说您会更喜欢jQuery而不是其他选择。我曾经上过基础的Prototype课程,让我感到无聊透顶。我刚刚在Lynda's完成了"jQuery基础教程",我非常喜欢它,因为它与CSS密切相关。我已经用原始JavaScript编程约10年了,我一直觉得它非常枯燥;对我来说,它是代码重复(投入产出比低)。尽管多年来它对我非常有用。从我目前所见,jQuery就应该是JavaScript从一开始就应该有的。但另一方面,改进需要大量的时间、测试和努力。所以,对我来说,jQuery胜出。


3
原文:Prototype also supports CSS selectors, using $$() instead of $()翻译:原型还支持CSS选择器,使用$$()代替$()。 - Vincent McNabb

2

我对jQuery和Prototype都没有经验。作为一名资深ColdFusion开发人员和项目经理,我打算学习其中之一并将其添加到我的工具箱中。我认为,初学者会选择其中一个作为自己的首选,因为这反映了行业的采用情况,而我认为这是关键。

通过快速浏览和阅读一些教程,它们似乎都提供相同的核心功能。然而,从招聘信息和其他项目来看,jQuery似乎更受“需求”的欢迎,而不仅仅是可以使用的技能。对我来说,jQuery在采用和需求方面胜出,社区支持和文档也是加分项。没有任何反对Prototype的意思,如果某个项目由于先前存在而需要它,那么了解它也是很好的,因为有些开发人员选择了它作为他们研究的第一个库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接