为啥 jQuery 似乎不鼓励使用常规 OOP?

Posted

技术标签:

【中文标题】为啥 jQuery 似乎不鼓励使用常规 OOP?【英文标题】:Why does jQuery seem to discourage the use of regular OOP?为什么 jQuery 似乎不鼓励使用常规 OOP? 【发布时间】:2010-11-09 00:42:31 【问题描述】:

我们最近使用 Prototype 构建了一个 Web 应用程序,大量使用了它的 Class.Create() 功能。现在,我们正在考虑迁移到 jQuery,因为它似乎被认为是一个“更好”的库。我一直在阅读有关该主题的内容,并发现 jQuery 没有像 Prototype 那样对类创建提供直接的内置支持。当然,还有 .prototype 和 jQuery.extend(如 https://***.com/questions/79477/how-to-create-an-object-oriented-class-in-jquery 中提到的),但经过更多搜索,我觉得 jQuery 并不真的“想要”你以这种方式编写脚本......

同一页面有一篇文章提到了 John Resig 的 Classy 插件,这对我来说看起来很棒。然而,该页面指出这实际上是一个愚人节玩笑,并且 Resig 实际上建议不要使用该代码。我很乐意帮忙,但我想了解这一切的原因是什么,当然,他们确实希望你做什么。有人能启发我吗?

-编辑-

感谢您提供有趣的答案。为了清楚起见:这是否意味着可以将我在 Prototype 中创建的类重写为“塑造”类的 jQuery 方式,并且仍然以与以前相同的“方式”使用它们?或者这仍然被认为是不好的做法,我应该使用不同的方法吗?

【问题讨论】:

供您参考 javascript 不是基于类的语言。它是一种基于原型的语言。 ...因此更类似于 Lisp 而不是 C:javascript.crockford.com/javascript.html (从拥有四年优势的人那里看到差异)即使这个article 是关于 Mootools 与 JQuery 的,Mootools 背后的推理本质上也适用于 PrototypeJS。 motto 部分说明了一切。 TL;博士; JQuery 是为 DOM 操作而设计的,而 Mootool(和 Prototype)是用 DOM 附加实用程序设计的,例如基于原型基础语言的类基础 OOP 等。 【参考方案1】:

第一次糟糕的 Google 搜索“面向对象的 javascript”出现了这个问题……但它解释了我想表达的观点:

JavaScript Object-Oriented Programming

只要看看第一段,你就会发现:

Javascript 不是完全面向对象的编程语言。 JS 中类的使用基于原型功能。 Prototype 库掩盖了使用原型功能来创建您的类。 jQuery 希望您像使用常规 JS 扩展 jQuery 本身并创建自己的自定义对象一样使用原型功能。

【讨论】:

jQuery 增强了 JavaScript 并且不尝试模拟一些其他语言。 +1 引用的段落是完全错误的。 Javascript 是一种完全面向对象的编程语言。它不是基于类的 OO 语言。 Prototype 的设计者决定提供一些 Class-fu 让很多人更舒服(包括我,当我开始使用它时)。读过 Crockford 的“Javascript: The Good Parts”后,我现在认为这是一个错误。 @Colin:正确。是的,完全错误。出于同样的原因,我不喜欢 Dojo。【参考方案2】:

我在从 Prototype 转换为 jQuery 时遇到了完全相同的问题,我仍然只能说是的,看起来它们并不是 Prototype 意义上的 oop。不过,编写 jQuery 代码你会发现自己严重依赖 JSON,我想这是最接近 oop 的伪官方的东西。

一些 jQuery ui 的东西实际上会迭代你传递的参数的所有属性,并用它做一些事情,这意味着你根本不能做,比如 Object.prototype,因为那会添加东西到每个对象,jQuery ui 都会尝试将其视为相关参数。

不过,速度和可扩展性是惊人的,所以我会说你克服 Prototype 只是时间问题,并且承认 Justin 的回复实际上是一个有效的观点:)

【讨论】:

【参考方案3】:

jQuery for JavaScript programmers 解释了 jQuery 如何鼓励好的 OOP 技术。

【讨论】:

【参考方案4】:

jQuery没有直截了当 对类创建的内置支持 像原型一样

不应该。类的创建最好留给程序员,而不是库。我从 Prototype 库开始,然后搬走了,因为它太臃肿了。 JavaScript 中的 OOP 一点也不难。只要您知道如何使用原型就可以了。

在处理 Prototype 的 Class.create 时,在 JavaScript 中制作等价的私有成员变得很棘手。老实说,我不认为 Class.create 给你任何有用的东西,你自己或使用 jQuery 都无法轻松完成。

您始终可以同时使用这两个库来帮助过渡。 jQuery 有一个很好的noConflict 功能,可以将$ 函数返回给它的原始所有者。

【讨论】:

以上是关于为啥 jQuery 似乎不鼓励使用常规 OOP?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不鼓励使用单例模式? [复制]

为啥在休眠中不鼓励复合键?

为啥不鼓励使用`.catch(err => console.error(err))`?

为啥现代 JavaScript 框架不鼓励与 DOM 直接交互

为啥不鼓励在 Java EE 容器中生成线程?

为啥 Django Rest Framework 不鼓励模型级别验证?