代码之家  ›  专栏  ›  技术社区  ›  ScottKoon

javascript是面向对象的吗?

  •  55
  • ScottKoon  · 技术社区  · 17 年前

    关于JavaScript是否是一种面向对象的语言,存在一些问题。即使是一句话,“仅仅因为一种语言有对象,也不能使它成为OO。”

    javascript是一种面向对象的语言吗?

    27 回复  |  直到 8 年前
        1
  •  53
  •   hippietrail    14 年前

    国际海事组织(这只是一个意见) 这个 面向对象语言的关键特征是它将支持 polymorphism . 几乎所有的动态语言都会这样做。

    下一个特点是 encapsulation 这在JavaScript中也很容易做到。

    然而在许多人的心目中 inheritance (特别是实现继承)这将在一种语言是否有资格被称为面向对象方面达到平衡。

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

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

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

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

    \u value属性是封装的,不能由外部代码直接修改。我们可以向类中添加一个转换器,以完全由类中的代码控制的方式修改它。现在考虑使用同一类的原型方法:

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

    这个坏了。由于分配给getValue的函数不再在带有\u值的范围内,因此无法访问它。我们需要将价值提升为 this 但这将使它在为类编写的代码的控制之外是可访问的,因此封装被破坏。

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

        2
  •  36
  •   Eli Bendersky    17 年前

    简短的回答是“是”。更多信息:

    Wikipedia :

    JavaScript非常基于对象。 对象是关联数组, 增加了原型(见下文)。 对象属性名称是关联的 数组键:obj.x=10和obj[“x”]= 10是等价的,点表示法 仅仅是句法上的糖分。 属性及其值可以是 添加、更改或删除时间: 运行时。对象的属性 也可以通过for…in枚举 循环。

    此外,参见 this series of articles 关于使用javascript的OOP。

        3
  •  24
  •   jop    17 年前

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

    这里是一个 article 讨论如何在JavaScript中执行OO。

        4
  •  19
  •   Eevee    17 年前

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

        5
  •  10
  •   David Mohundro alexsmn    17 年前

    是和不是。

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

        6
  •  10
  •   munificent    17 年前

    javascript是面向对象的,但不是 基于类 面向对象的语言,如Java、C++、C等。基于类的面向对象语言是OOP语言的更大家族的一个子集,它也包括基于原型的语言,如JavaScript和Soad。

        7
  •  8
  •   elixenide Ren    8 年前

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

    _面向对象_一词是由Alan Kay在1967年创造的,他在2003年解释为

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

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

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

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

    结论:javascript是面向对象的。

        8
  •  6
  •   Sören Kuklau Keith Boynton    17 年前

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

    @维基百科说的是物体- 基于 . 这与面向对象不同。事实上, their article on object-based 区分面向对象语言和基于原型语言,显式调用javascript 面向对象。

        9
  •  3
  •   Christian C. Salvadó    17 年前

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

        10
  •  2
  •   Christian Davén    17 年前

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

    (但实际上,为什么OO语言必须实现类呢?我想 物体 是关键的组成部分。如何创建和使用它们是另一回事。)

        11
  •  2
  •   Gene T    17 年前

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

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

    这是我经常提到的原型和功能的图片

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

        12
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

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

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

    当人们断言JavaScript是一种面向对象编程语言,因为他们可以使用面向对象编程语言时,我会问:为什么C不是面向对象编程语言?重复一遍,你可以用ood和c,如果你说c是一种oo编程语言,每个人都会说你疯了。

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

    Javascript多年来没有改变,但新的程序员想展示Javascript是一种面向对象编程语言。为什么?JavaScript是一种功能强大的语言,但不是OO编程语言。

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

    一个很好的例子:在“面向对象的javascript”的第6章中描述 十、实施“继承”的方式。 Java中有多少种礼貌?一个,在C++中?一个,在Delphi(对象pascal)中?第一,目标C?一个。

    为什么会不同?因为Java、C++、Delphi和Objy-C都是用OOP设计的,而不是JavaScript。

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

    总之,这是证据,不是所有人都对这个话题有一些看法:)

    无论如何,在我看来,javascript是一种强大的语言,在客户端层是未来的发展方向!

        13
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    汉赛尔分钟 episode 146 看看Oajax。这是一个很好的节目,也是一个很好的节目来帮助形成一个观点。

        14
  •  1
  •   rodrigo-silveira selftaught91    14 年前

    MiskoHevery做了一个很好的谷歌技术入门讲座,在那里他谈到了JavaScript中的对象。我发现这是一个很好的起点,人们要么质疑JavaScript中对象的使用,要么希望开始使用它们:

        15
  •  0
  •   urini    17 年前

    这个 Microsoft Ajax Client Library 使在JavaScript中实现OO变得简单。它支持固有性和接口实现。

        16
  •  0
  •   Andrew Hedges    17 年前

    我认为很多人回答这个问题“不”,因为在传统的OO意义上,javascript不实现类。不幸的是(imho),这是在ecmascript 4。在此之前,Viva la原型!-)

        17
  •  0
  •   mattlant    17 年前

    我认为当你可以遵循与Java或C语言一样的真实OO语言的相同或相似的设计模式时,你可以把它称为OO语言。有些方面明显不同,但您仍然可以使用非常好的OO设计模式。

        18
  •  0
  •   dsm    17 年前

    JavaScript是基于对象的,而不是面向对象的。区别在于,基于对象的语言不支持适当的继承,而面向对象的语言支持。

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

        19
  •  0
  •   matt lohkamp    17 年前

    javascript中的所有内容都是一个对象——类是对象,函数是对象,数字是对象,对象是对象。它不像其他语言那样严格地打字,但绝对可以编写OOP JS。

        20
  •  0
  •   bmeck    17 年前

    javascript不是一种典型的面向对象的语言,主要是由于缺乏真正的继承,duck类型允许半真形式的继承/多态性以及object.prototype允许复杂的函数共享。然而,在其核心,缺乏继承导致了一个弱多态性的发生,因为duck类型会坚持一些具有相同属性名的对象是一个对象的实例,而这些对象并不打算被用作对象的实例。因此,向随机对象添加属性可以以某种方式转换其类型的基。

        21
  •  0
  •   Rik elirevach    17 年前

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

        22
  •  0
  •   Vasil    17 年前

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

        23
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

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

        24
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

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

        25
  •  0
  •   Kokodoko    14 年前

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

    让我困惑的是,在javascript中,您甚至不能使用函数名,因为 在您使用的任何外部库中,都有可能在其他地方使用相同的函数名。

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

    OOP的好处在于,你可以花时间思考应用程序的逻辑,而不必担心语法问题。

        26
  •  0
  •   Vinayak Bevinakatti    14 年前

    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

        27
  •  -1
  •   Per Hornshøj-Schierbeck    17 年前

    我会说它有能力看起来很糟糕。尤其是如果您利用它的能力在现有对象上创建方法(某些语言中的匿名方法)。像jquery(jquery.com)或prototype(prototypejs.org)这样的客户机脚本库是利用这一点的库的好例子,使javascript的行为非常像OO。