JavaScript是面向对象的吗?

时间:2008-09-20 07:03:05

标签: javascript oop

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

JavaScript是面向对象的语言吗?

27 个答案:

答案 0 :(得分:53)

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中实现它。

答案 1 :(得分:36)

简短的回答是肯定的。有关更多信息:

来自Wikipedia

  

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

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

答案 2 :(得分:24)

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

以下是article讨论如何在Javascript中执行OO。

答案 3 :(得分:19)

语言不需要像Java一样面向对象。 Javascript中的所有内容都是一个对象;与C ++或更早的Java相比,它们在某种程度上被广泛认为是面向对象的,但仍然基于原语。多态性在Javascript中不是问题,因为它根本不关心类型。语法不直接支持的唯一核心OO功能是继承,但是可以轻松实现,但程序员想要使用原型:here就是这样一个例子。

答案 4 :(得分:10)

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

答案 5 :(得分:10)

是和否。

正如Douglas Crockford所说,JavaScript是“the world's most misunderstood programming language。”他有一些great articles on JavaScript,我强烈建议您阅读JavaScript究竟是什么。与CIS的LISP有更多共同之处。

答案 6 :(得分:8)

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

“面向对象”这个词是由Alan Kay于1967年创造的,他在2003年解释说

  

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

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

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

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

结论:JavaScript是面向对象的。

答案 7 :(得分:6)

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

@eliben:维基百科说对象基于。这与面向对象不同。实际上,their article on object-based区分了面向对象的语言和基于原型的语言,明确地调用了JavaScript 而不是面向对象。

答案 8 :(得分:3)

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

答案 9 :(得分:2)

我正在回答这个问题从另一个角度反弹。

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

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

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

多年来JavaScript并没有改变,但新程序员想要展示JavaScript是一种OO编程语言。为什么? JavaScript是一种强大的语言,但它不是OO编程语言。

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

一个非常简单的例子:在“面向对象的JavaScript”的第6章中描述了 10种实现“继承”的方式。 Java中有多少种方式?一,在C ++中?一,在Delphi(Object Pascal)中?一,在Objective-C?之一。

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

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

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

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

答案 10 :(得分:2)

一个好的主题。这是我喜欢的一些资源。大多数人从原型,jquery或前6个库(mootools,ExtJS,YUI)中的一个开始,它们具有不同的对象模型。原型试图复制经典的O-O,就像大多数人想到的那样

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

这是我参考的原型和功能的图片

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

答案 11 :(得分:2)

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

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

答案 12 :(得分:1)

Hanselminutes episode 146着眼于OO Ajax。这是一个很好的节目,绝对是一个很好的节目,以帮助形成一个意见。

答案 13 :(得分:1)

Misko Hevery做了一个精彩的Google Tech Talk介绍,他在Javascript中讨论了对象。我发现这对于人们质疑在Javascript中使用对象或者想要开始使用它们是一个很好的起点:

答案 14 :(得分:0)

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

答案 15 :(得分:0)

  

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

答案 16 :(得分:0)

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

让我感到困惑的是,Javascript中的任何结尾都是你甚至无法使用函数名,因为 你冒着在你正在使用的任何外部库中的其他地方具有相同功能名称的风险。

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

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

我认为很多人都回答这个问题“不”,因为JavaScript在传统的OO意义上没有实现类。不幸的是(恕我直言),即将进入ECMAScript 4.直到那时,viva la原型! : - )

答案 25 :(得分:0)

Microsoft Ajax Client Library使得在javascript中实现OOP变得简单。它支持继承和接口实现。

答案 26 :(得分:-1)

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

相关问题