JavaScript是面向对象的吗?

关于JavaScript是否是一种面向对象的语言,有一些问题。 即使是一个声明,“仅仅因为语言有对象,也不会使它成为OO”。

JavaScript是面向对象的语言吗?

国际海事组织(而且这只是一个意见) 面向对象语言关键特点是它将支持多态 。 几乎所有的dynamic语言都这样做。

下一个特性是封装 ,而且在Javascript中也很容易做到。

然而,在许多人的头脑中,它是inheritance (特别是实现inheritance),这将平衡语言是否有资格被称为面向对象。

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

所以如果你的面向对象的标准是多态的经典三人组,封装和inheritance,那么Javascript不会通过。

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

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

_value属性被封装,不能被外部代码直接修改。 我们可以在类中添加一个修改器,以完全由类的一部分代码控制的方式修改它。 现在考虑对同一个class级的原型方法:

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

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

尽pipe如此,我的投票仍然是Javascript是面向对象的。 为什么? 因为给定一个OOD,我可以在Javascript中实现它。

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

维基百科 :

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

另外,请参阅关于使用Javascript进行OOP的这一系列文章 。

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

这里有一篇文章讨论如何在Javascript中做OO。

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

是和不是。

正如道格拉斯·克罗克福德(Douglas Crockford)所说,JavaScript是“ 世界上最容易被误解的编程语言” 。 他在JavaScript上有一些很棒的文章 ,我强烈推荐阅读JavaScript。 它与LISP有更多相似之处,即C ++。

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

JavaScript是一种基于原型的编程语言(可能是基于原型的脚本语言是更正确的定义)。 它采用克隆而不是inheritance。 基于原型的编程语言是没有类的面向对象编程风格。 虽然面向对象的编程语言鼓励把注意力放在分类和关系上,但基于原型的编程语言鼓励把注意力集中在行为上,然后进行分类。

“面向对象”一词是由艾伦·凯(Alan Kay)在1967年创造的,他在2003年解释说这个意思

只有消息传递,地方保留和保护和隐藏国家进程,以及所有事物的极端晚期约束。 (资源)

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

对于面向对象的语言来说,可能包括封装,模块化,多态和inheritance等特性,但这不是必需的。 使用类的面向对象编程语言通常被称为基于分类的编程语言,但绝不一定要使用类来面向对象。

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

结论:JavaScript是面向对象的。

ðdýrvefhýsing

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

@eliben:维基百科说基于对象 。 这不同于面向对象的。 实际上, 他们关于基于对象的文章区分了面向对象的语言和基于原型的语言,明确地说JavaScript 不是面向对象的。

JavaScript是编写面向对象的Web应用程序的非常好的语言。 它可以支持OOP,因为通过原型的支持inheritance还有属性和方法。 你可以有多态性,封装和许多子分类范例。

这当然是主观的,也是一个学术问题。 有些人认为面向对象的语言是否需要实现类和inheritance,其他人写的程序会改变你的生活。 😉

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

一个好主意。 这里有一些我喜欢的资源。 大多数人从原型,jquery或者前6个lib(mootools,ExtJS,YUI)之一开始,它们有不同的对象模型。 原型试图复制经典的OO,正如大多数人所想的那样

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

这里是我介绍的原型和function的图片

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

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

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

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

我们可以在很老的书籍和论坛里提到很多关于这个话题的参考资料,因为这个话题比互联网还早。

JavaScript并没有改变很多年,但是新的程序员想要显示JavaScript是一种OO编程语言。 为什么? JavaScript是一种function强大的语言,但不是面向对象的编程语言。

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

一个非常具体的例子:在“面向对象的JavaScript”的第6章中描述了实现“inheritance”的10种方式。 Java有多less种礼貌? 一,在C + +? 一,在Delphi(Object Pascal)中? 一个,在Objective-C? 一。

为什么这是不同的? 因为Java,C ++,Delphi和Objective-C都是在OOP的基础上devise的,而不是JavaScript。

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

无论如何,这是证据,并不是所有的人都对这个话题有一些意见:)

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

Hanselminutes 第146集看OO阿贾克斯。 这是一个很好的表演,绝对是一个很好的表演来帮助形成意见。

Misko Hevery做了一个很好的介绍性的Google技术讲座,他谈到了Javascript中的对象。 我发现这是一个很好的起点,可以让人们质疑在Javascript中使用对象,或者想要开始使用它们:

  • JavaScript和浏览器DOM介绍

Microsoft Ajax客户端库使得在JavaScript中实现OO变得简单。 它支持吸入性和接口实现。

我认为很多人回答这个问题“不”,因为JavaScript没有实现类,在传统的OO意义上。 不幸的是(恕我直言),这是ECMAScript 4即将到来,非常原型! 🙂

我认为当你可以像Java / C#那样遵循相同或相似的devise模式时,你几乎可以称之为OO语言。 有些方面明显不同,但你仍然可以使用非常完善的面向对象devise模式。

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

有一种方法可以在JavaScript中实现“正常”inheritance( 参考这里 ),但基本模型是基于原型的。

JavaScript中的所有东西都是一个对象 – 类是对象,函数是对象,数字是对象,对象是对象。 它不像其他语言那么严格,但是写OOP JS绝对是可能的。

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

从技术上讲,这是一个原型语言,但是很容易在其中进行OO。

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

是的。 然而,它并不支持所有在缺乏inheritance性和多态性的面向对象编程语言中所期望的特性。 但是,这并不意味着您无法通过语言原型系统来模拟这些function。

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

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

让我感到迷惑的是,在Javascript中,我们甚至无法使用函数名称,因为在所使用的任何外部库中,您都有可能使用相同的函数名称。

即使一些非常聪明的人已经find了解决方法,是不是很奇怪,在它的最纯粹的forms的JavaScript需要你创build高度不可读的代码?

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

JavaScript是面向对象的吗?

答:是的

它有可以包含数据和方法的对象。 对象可以包含其他对象。

  • 它没有类,但它确实有构造函数来做类的function,包括作为类variables和方法的容器。
  • 它没有面向类的inheritance,但它具有面向原型的inheritance。

构build对象系统的两种主要方法是inheritance(is-a)和聚合(has-a)。 JavaScript同时具有这两种function,但其dynamic特性使其能够在聚合方面performance突出。

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

但事实certificate, JavaScript对象可以有私有variables和私有方法。 (点击这里了解如何。)当然,很less有人理解这一点,因为JavaScript是世界上最容易被误解的编程语言。

有些人认为JavaScript并不是真正的面向对象,因为它不提供inheritance。 但事实certificate, JavaScript不仅支持经典inheritance,还支持其他代码重用模式。

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

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