【问题标题】:Is JavaScript object-oriented?JavaScript 是面向对象的吗?
【发布时间】:2010-09-11 13:41:14
【问题描述】:

关于 JavaScript 是否是一种面向对象的语言存在一些疑问。即使是这样的声明,“仅仅因为一门语言有对象并不能使它成为 OO。”

JavaScript 是面向对象的语言吗?

【问题讨论】:

  • 我会添加“主观”标签
  • 我不认为这是主观的。它要么是,要么不是,或者它处于中间是有特定原因的。为什么你认为它是主观的?
  • 这个问题在发布后 34 秒内有 11 个答案 - 哇。
  • 因为“面向对象”的定义并没有指定一系列标准来确定准确的答案
  • 我同意 Sklivvz 的观点,这是主观的,因为没有权威明确规定语言必须具有哪些特征才能具有形容词“面向对象”。

标签: javascript oop


【解决方案1】:

简短的回答是肯定的。欲了解更多信息:

来自Wikipedia

JavaScript 很大程度上是基于对象的。 对象是关联数组, 增加了原型(见下文)。 对象属性名称是关联的 数组键:obj.x = 10 和 obj["x"] = 10 是等价的,点符号 仅仅是语法糖。 属性及其值可以是 添加、更改或删除 运行。对象的属性 也可以通过 for...in 枚举 循环。

另外,请参阅 this series of articles 了解有关使用 Javascript 的 OOP。

【讨论】:

    【解决方案2】:

    Javascript 是一种多范式语言,支持过程式、面向对象(基于原型)和函数式编程风格。

    这是一个article,讨论如何在 Javascript 中进行 OO。

    【讨论】:

      【解决方案3】:

      JavaScript 是一种非常适合编写面向对象的 Web 应用程序的语言。它可以支持 OOP,因为通过原型设计也支持属性和方法的继承。您可以拥有多态性、封装性和许多子类范式。

      【讨论】:

        【解决方案4】:

        语言不需要完全像 Java 那样是面向对象的。 Javascript 中的一切都是对象;与 C++ 或更早的 Java 相比,后者在某种程度上被广泛认为是面向对象的,但仍基于原语。多态在 Javascript 中不是问题,因为它根本不关心类型。语法不直接支持的唯一核心 OO 特性是继承,但可以很容易地实现,但程序员希望使用原型:here 就是这样一个例子。

        【讨论】:

        • 吹毛求疵:Javascript 也有原始值,它们不是对象。未定义、null、布尔值、数字和字符串,要具体。
        • 我知道 Javascript 有原始类型,但我并不认为它们是通常意义上的,因为它们仍然像对象一样act(除了那些明确表示“无”的对象)。 typeof("foo") 给你'string'而不是'object',是的,但是字符串仍然有方法; "foo".substr(1) 有效。
        • 哈,我并不是要煽动战争,只是与一种几乎被普遍认为是面向对象的语言进行比较。也许我应该澄清一下。
        • 我删除了我的评论,因为它不再相关。请散开,这里没什么可看的:)
        • @InternetFriend - typeof(null) = 'object', boolean, number 和 string 都是扩展 object 的类,undefined 永远不是一个值,根据定义它是没有值和 它本身被定义的地方它是一个属性
        【解决方案5】:

        Microsoft Ajax Client Library 使在 javascript 中实现 OO 变得简单。支持inharitence,接口实现。

        【讨论】:

          【解决方案6】:

          我认为很多人回答这个问题“不”,因为 JavaScript 没有实现传统 OO 意义上的类。不幸的是(恕我直言),这将在 ECMAScript 4 中出现。在那之前,原型万岁! :-)

          【讨论】:

          • 我想这取决于您的 OO 风格所声称的传统。
          【解决方案7】:

          我会说它具有看起来 OO 的能力。特别是如果您利用它在现有对象上创建方法的能力(某些语言中的匿名方法)。 jquery (jquery.com) 或原型 (prototypejs.org) 等客户端脚本库是利用这一点的库的很好示例,使 javascript 的行为非常类似于 OO。

          【讨论】:

          • 为什么人们认为经典 OOP 是 OOP 的唯一真正形式。 掌心
          • 什么时候有古典 OOP 这样的东西。那么新的 OOP 是什么......随着 Metallica 的曲调,不知道发生了什么,但玩得很开心?......对不起......我很紧张......:)跨度>
          【解决方案8】:

          这当然是主观和学术问题。有些人争论 OO 语言是否必须实现类和继承,有些人编写的程序会改变你的生活。 ;-)

          (但实际上,为什么 OO 语言必须实现类?我认为 对象 是关键组件。如何创建和使用它们是另一回事。)

          【讨论】:

            【解决方案9】:

            与大多数面向对象的语言不同,JavaScript(无论如何,在 ECMA 262 第 4 版之前)没有类的概念,而是原型。因此,是否称其为面向对象确实有点主观。

            @eliben:维基百科说基于对象。这与面向对象不同。事实上,their article on object-based 区分了面向对象的语言和基于原型的语言,显式调用 JavaScript not 面向对象。

            【讨论】:

            • 但是,如果您阅读有关基于对象的语言的补充文章,则会注意到 Javascript 是一种面向对象的语言,尽管它是基于原型的语言。给出的基于对象的语言的唯一示例是现在大部分已弃用的 VisualBasic。
            【解决方案10】:

            我认为,当您可以遵循与 Java/C# 等真正的 OO 语言相同或相似的设计模式时,您几乎可以将其称为 OO 语言。有些方面明显不同,但您仍然可以使用非常成熟的 OO 设计模式。

            【讨论】:

              【解决方案11】:

              JavaScript 是基于对象的,而不是面向对象的。不同之处在于基于对象的语言不支持正确的继承,而面向对象的语言则支持。

              有一种方法可以在 JavaScript (Reference here) 中实现“正常”继承,但基本模型是基于原型设计的。

              【讨论】:

                【解决方案12】:

                javascript 中的一切都是对象——类是对象,函数是对象,数字是对象,对象是对象。打字没有其他语言那么严格,但是绝对可以写OOP JS。

                【讨论】:

                • Javascript 没有类
                • 新关键字右边的标识符是什么?
                • 没错,javascript 没有类,这很公平——但你创建的对象是近似类,至少在你如何与它们交互方面。
                • 类是一种记账结构。对象不一定与对象有任何关系。恕我直言,使对象产生的原因是 lambda。
                【解决方案13】:

                Hanselminutes episode 146 关注 OO Ajax。这是一个很好的节目,绝对是一个有助于形成意见的好节目。

                【讨论】:

                • 老实说,该节目延续了一些关于 JavaScript 的错误描述,这也是我在这里提出这个问题的原因。我想要一个地方,下次有人声称 JavaScript 不是面向对象时,我可以指出来。
                【解决方案14】:

                是的,是的。然而,它并不支持缺乏继承和多态性的面向对象编程语言所期望的所有特性。然而,这并不意味着您无法通过该语言可用的原型系统来模拟这些功能。

                【讨论】:

                  【解决方案15】:

                  IMO(这只是一种意见)面向对象语言的关键特征是它将支持polymorphism。几乎所有动态语言都这样做。

                  下一个特征是encapsulation,这在 Javascript 中也很容易做到。

                  然而,在许多人的心目中,inheritance(特别是实现继承)会在语言是否有资格被称为面向对象方面打破平衡。

                  Javascript 确实提供了一种通过原型设计继承实现的相当简单的方法,但这是以封装为代价的。

                  因此,如果您的面向对象标准是多态性、封装和继承的经典三者,那么 Javascript 就不会通过。

                  编辑:提出了补充问题“原型继承如何牺牲封装?”考虑这个非原型方法的例子:-

                  function MyClass() {
                      var _value = 1;
                      this.getValue = function() { return _value; }
                  }
                  

                  _value 属性是封装的,不能被外部代码直接修改。我们可能会在类中添加一个 mutator,以完全由类中的代码控制的方式对其进行修改。现在考虑对同一类的原型方法:-

                  function MyClass() {
                    var _value = 1;
                  }
                  MyClass.prototype.getValue = function() { return _value; }
                  

                  好吧,这坏了。由于分配给 getValue 的函数不再在 _value 的范围内,因此无法访问它。我们需要将 _value 提升为 this 的属性,但这会使其在为类编写的代码的控制之外可访问,因此封装被破坏。

                  尽管如此,我仍然认为 Javascript 是面向对象的。为什么?因为给定 OOD 我可以用 Javascript 实现它。

                  【讨论】:

                  • 原型继承如何牺牲封装?
                  • 封装需要在构造对象时创建的执行上下文中存储私有数据。添加到原型的成员无权访问此执行上下文,因此无法访问封装的数据。
                  • 你说得对,C# 不是必需的,我没有抓住重点。然而,重点应该是这个。封装不等于信息隐藏。 IH 是一个与封装相关的概念。信息隐藏是您编辑提示的内容。封装比这更具概念性。它指的是外部世界用来与对象交互的东西。因此 Scott Koon 的问题。
                  • 郑重声明,JavaScript 在这方面并不是唯一的。 Python 也没有强制封装的机制。 Python 对象的所有成员实际上都是公共的,Python 仅使用命名约定来指示成员应被视为“私有”。但是没有人质疑 Python 是否是一种 OO 语言。
                  • 一个更真实的OO定义将基于“消息传递”;在任何 OO 语言中,主要的设计方法是“对象将消息传递给其他对象”而不是“访问和修改字段”。方法调用是一种流行的消息传递形式。多态性和继承不是 OO 的固有属性,它们只是由于静态类型施加的限制而必需的;封装是消息传递系统固有的(因为你从不直接访问变量,你只是向其他对象发送消息),但这不是 OO 的主要关注点。
                  【解决方案16】:

                  Javascript 不是通常认为的面向对象的语言,主要是由于缺乏真正的继承,DUCK 类型允许继承/多态的半真实形式以及允许复杂函数共享的 Object.prototype。然而,在其核心,缺乏继承会导致发生弱多态性,因为 DUCK 类型会坚持某些具有相同属性名称的对象是它们不打算用作对象的实例。因此,向随机对象添加属性会以某种方式转换其类型的基础。

                  【讨论】:

                    【解决方案17】:

                    JavaScript 是面向对象的,但不像 Java、C++、C# 等那样基于类面向对象的语言。基于类的 OOP 语言是更大的 OOP 家族的子集还包括基于原型的语言,如 JavaScript 和 Self。

                    【讨论】:

                      【解决方案18】:

                      从技术上讲,它是一种原型语言,但在其中很容易实现 OO。

                      【讨论】:

                        【解决方案19】:

                        它是面向对象的,但不是基于类,而是基于原型。

                        【讨论】:

                          【解决方案20】:

                          是和不是。

                          正如 Douglas Crockford 所说,JavaScript 是“the world's most misunderstood programming language”。他有一些great articles on JavaScript,我强烈建议您阅读 JavaScript 到底是什么。它与 LISP 的共同点在于 C++。

                          【讨论】:

                          【解决方案21】:

                          JavaScript 是一种基于原型的编程语言(可能基于原型的脚本语言是更正确的定义)。它采用克隆而不是继承。基于原型的编程语言是一种没有类的面向对象编程风格。面向对象的编程语言鼓励开发关注分类和关系,而基于原型的编程语言鼓励先关注行为,然后再进行分类。

                          “面向对象”一词是 Alan Kay 在 1967 年创造的,他在 2003 年将其解释为

                          只有消息传递、本地保留、保护和隐藏状态进程,以及所有事物的极端后期绑定。 (source)

                          在面向对象的编程中,每个对象都能够接收消息、处理数据以及向其他对象发送消息。

                          对于面向对象的语言,可能包括封装、模块化、多态性和继承等特性,但这不是必需的。使用类的面向对象编程语言通常被称为基于类的编程语言,但使用类并不是必须的。

                          JavaScript 使用原型来定义对象属性,包括方法和继承。

                          结论:JavaScript 是面向对象的。

                          【讨论】:

                          • 我怀疑我们当中只有少数人能够记住面向对象的定义。我记得 20 年前使用 VAX BASIC 交付 OOD。
                          【解决方案22】:

                          一个很好的线程。这里有一些我喜欢的资源。大多数人从原型、jquery 或前 6 个库之一(mootools、ExtJS、YUI)开始,它们具有不同的对象模型。 Prototype 试图复制大多数人认为的经典 O-O

                          http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

                          这是我经常参考的原型和函数的图片

                          http://www.mollypages.org/misc/js.mp?

                          【讨论】:

                            【解决方案23】:

                            JavaScript 中的对象直接继承自对象。什么可以更面向对象?

                            【讨论】:

                              【解决方案24】:

                              我是从另一个角度回答这个问题。

                              这是一个永恒的话题,我们可以在很多论坛上开火。

                              当人们断言 JavaScript 是一种 OO 编程语言因为他们可以使用 OOD 时,我会问:为什么 C 不是一种 OO 编程语言?重复一遍,你可以在 C 中使用 OOD,如果你说 C 是一种 OO 编程语言,每个人都会说你疯了。

                              我们可以在非常古老的书籍和论坛中放很多关于这个话题的参考资料,因为这个话题比互联网还要古老:)

                              JavaScript 多年来一直没有改变,但新程序员希望表明 JavaScript 是一种 OO 编程语言。为什么? JavaScript 是一种强大的语言,但不是面向对象的编程语言。

                              OO 编程语言必须具有对象、方法、属性、类、封装、聚合、继承和多态性。你可以实现所有这些点,但 JavaScript 没有。

                              一个非常形象的例子:在“面向对象的JavaScript”的第6章中描述了实现“继承”的10种方式。Java中有多少种方式?一,在 C++ 中?一,在德尔福(对象帕斯卡)?一,在Objective-C中?一。

                              为什么会有所不同?因为 Java、C++、Delphi 和 Objective-C 在设计时考虑了 OOP,而不是 JavaScript。

                              当我还是学生时(1993 年),在大学里,有一个典型的家庭作业:用非 OO 语言实现一个使用 OOD(面向对象设计)设计的程序。在那个时候,选择的语言是 C(不是 C++)。这种做法的目的是明确 OOD 和 OOP 之间的区别,并且可以区分 OOP 和非 OOP 语言。

                              无论如何,有证据表明并非所有人都对这个话题有一些看法:)

                              无论如何,在我看来,JavaScript 是一种强大的语言,也是客户端层的未来!

                              【讨论】:

                              • 你的 OOP 概念太狭窄了,受 C++ 和 Java 的影响。
                              【解决方案25】:

                              Misko Hevery 做了一个出色的 Google 技术讲座介绍性,他在其中谈到了 Javascript 中的对象。我发现对于那些质疑 Javascript 中对象的使用或想要开始使用它们的人来说,这是一个很好的起点:

                              【讨论】:

                                【解决方案26】:

                                对我个人而言,OOP 编程的主要吸引力在于能够拥有具有未公开(私有)内部工作的自包含类。

                                在 Javascript 中让我困惑不已的是,你甚至不能使用函数名,因为 您冒着在您正在使用的任何外部库中的其他地方使用相同函数名称的风险。

                                尽管一些非常聪明的人已经找到了解决方法,但最纯粹的 Javascript 要求您创建高度不可读的代码,这不是很奇怪吗?

                                OOP 的美妙之处在于您可以花时间思考应用程序的逻辑,而不必担心语法。

                                【讨论】:

                                  【解决方案27】:

                                  JavaScript 是面向对象的吗?

                                  答案:是的

                                  它具有可以包含数据的对象和作用于该数据的方法。对象可以包含其他对象。

                                  • 它没有类,但它有构造函数来完成类的工作,包括充当类变量和方法的容器。
                                  • 它没有面向类的继承,但有面向原型的继承。

                                  构建对象系统的两种主要方式是继承(is-a)和聚合(has-a)。 JavaScript 两者兼而有之,但其动态特性使其在聚合方面表现出色。

                                  有些人认为 JavaScript 并不是真正的面向对象,因为它不提供信息隐藏。也就是说,对象不能有私有变量和私有方法:所有成员都是公共的。

                                  但事实证明 JavaScript objects can have private variables 和私有方法。 (立即点击此处了解如何操作。)当然,很少有人理解这一点,因为 JavaScript 是世界上最容易被误解的编程语言。

                                  有些人认为 JavaScript 并不是真正的面向对象,因为它不提供继承。但事实证明,JavaScript supports not only classical inheritance, but other code reuse patterns as well.

                                  来源:http://javascript.crockford.com/javascript.html

                                  【讨论】:

                                    猜你喜欢
                                    • 2014-02-10
                                    • 1970-01-01
                                    • 2014-07-08
                                    • 2011-03-26
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2010-10-22
                                    • 2016-12-06
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多