为什么jQuery似乎不鼓励使用常规的面向对象编程?

15

我们最近使用Prototype构建了一个Web应用程序,充分利用了它的Class.Create()功能。现在,我们正在考虑迁移到jQuery,因为它似乎被认为是一个“更好”的库。我已经阅读了一些关于这个主题的文章,并发现jQuery没有像Prototype那样直接内置支持类创建的功能。当然,仍然有.prototype和jQuery.extend(如https://stackoverflow.com/questions/79477/how-to-create-an-object-oriented-class-in-jquery中所提到的),但经过进一步搜索,我感觉 jQuery并不真正“希望”你以这种方式编写脚本...

同一页上还有一篇提到John Resig的Classy插件的帖子,看起来很不错。然而,该页面指出它实际上是愚人节玩笑,并且Resig实际上建议不要使用该代码。我很乐意遵从,但我想知道所有这些背后的原因,并且当然,他们希望你做的是什么。有人能启发我一下吗?

-编辑-

感谢有趣的答案。为了明确起见:这是否意味着将我在Prototype中创建的类重写为jQuery的“形状”类,然后仍然可以像以前一样使用它们?还是这仍然被认为是不好的做法,应该采用其他方法?


4
JavaScript不是基于类的语言,而是基于原型的语言。 - rahul
...因此更类似于Lisp而不是C:http://javascript.crockford.com/javascript.html - Boldewyn
即使这篇文章是关于Mootools vs JQuery的,但Mootools背后的原理基本上也适用于PrototypeJS。座右铭部分已经说明了一切。简而言之,JQuery是为DOM操作而设计的,而Mootool(和Prototype)则是为DOM和其他实用程序(如基于原型的类OOP语言等)而设计的。 - OnesimusUnbound
4个回答

11

首先糟糕的谷歌搜索“面向对象JavaScript”找到了这个...但它解释了我想要表达的观点:

JavaScript面向对象编程

只需看一下第一段,就会发现:

Javascript不是完全面向对象的编程语言。JS中类的使用基于原型功能。原型库掩盖了使用原型功能来创建你的类的过程。jQuery希望你以与常规JS扩展jQuery本身并创建自己的自定义对象相同的方式使用原型功能。


7
jQuery增强了JavaScript,而不是试图模拟其他语言。 +1 - Boldewyn
4
引用的段落是错误的。JavaScript 是一种完全面向对象的编程语言,它不是基于类的面向对象语言。Prototype 的设计者决定提供一些类机制,以使许多人(包括我在内)感到更加舒适。但是,阅读了 Crockford 的《JavaScript权威指南》后,我现在认为这是一个错误。 - Colin Fine
@Colin:正确。而且,是的,完全错误。我也不喜欢Dojo的原因相同。 - Jess Jacobs

4

1

我曾经遇到过从Prototype转换到jQuery的同样问题,我只能说,似乎他们并不是很喜欢Prototype中的oop。但是,在编写jQuery时,你会发现自己严重依赖JSON,这也许是你能得到的最接近oop的伪官方东西。

jQuery ui的一些东西实际上会迭代传递的参数的所有属性,并对其进行操作,这意味着你根本不能使用Object.prototype,因为那会向每个对象添加一些东西,而jQuery ui会试图将其视为相关参数。

尽管如此,速度和可扩展性都非常惊人,所以我认为在一段时间后你会克服Prototype,并接受Justin的回复实际上是一个有效的观点:)


0
jQuery没有像Prototype一样直接内置对类创建的支持。 正如它不应该这样做,类的创建最好由程序员而非库来完成。我曾经使用过 Prototype 库,但是因为它太冗长而开始转向其他方案。在 JavaScript 中实现面向对象编程并不难,只要你理解原型的用法即可。 当涉及到Prototype的 Class.create 时,在JavaScript中实现私有成员变得棘手。而且,我认为Class.create并没有提供什么有用的功能,你可以轻松地自己完成或使用jQuery完成。 你始终可以同时使用这两个库来帮助过渡。jQuery具有这个很好的 noConflict 功能,可以将 $ 函数返回到其原始所有者处。

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