JavaScript是面向对象?JavaScript是面向对象?(Is JavaScript obj

2019-05-14 12:59发布

已经有关于JavaScript是否是一个面向对象的语言的一些问题。 即使是声明,“只是因为语言具有对象不让它OO”。

JavaScript是一种面向对象的语言?

Answer 1:

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

接下来的特点是封装 ,这是很容易在JavaScript中执行也。

然而,在许多人心中它是继承 (具体实现继承),这将打破平衡,以一种语言是否有资格被称为面向对象的。

JavaScript并提供了一个相当简单的方法通过原型继承的实现,但这是在封装的代价。

所以,如果你对面向对象的标准是多态,封装和继承的经典三人组然后JavaScript并没有通过。

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

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

所述_value属性被封装,它不能由外部代码直接修改。 我们可以赋值函数添加到类进行修改通过代码完全控制的方式,是类的一部分。 现在考虑一个原型方法同一类: -

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

嗯,这是坏了。 由于分配到的getValue的功能范围不再与_value它不能访问它。 我们需要促进_value到的属性this但这将使其成为该类编写的代码控制的accessable之外,因此封装坏了。

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



Answer 2:

简短的回答是肯定的。 欲获得更多信息:

从维基百科 :

JavaScript是大量基于对象的。 对象是关联数组,与原型(见下文)扩增。 对象属性名称关联数组键:obj.x = 10和OBJ [“×”] = 10是等效的,所述点标记为仅仅语法糖。 属性和它们的值可以添加,更改或在运行时被删除。 一个对象的属性也可以通过for ... in循环枚举。

此外,请参阅本系列文章中关于使用JavaScript OOP。



Answer 3:

JavaScript是支持程序,面向对象(原型为基础)和功能性编程风格的多范例语言。

下面是一个文章讨论如何做OO的Javascript。



Answer 4:

语言并不需要表现得完全像Java是面向对象的。 在Javascript中一切都是对象; 比较C ++或Java的早期,这被广泛认为是在一定程度上,但仍基于原语的面向对象的。 多态性是在Javascript不成问题,因为它不会在乎类型的。 通过语法不直接支持的唯一的核心OO特性是继承,但却程序员希望使用原型,可以很容易地实现: 这里就是这样一个例子。



Answer 5:

是的,没有。

JavaScript是,道格拉斯克罗克福德所说,“ 世界上最被人误解的编程语言 。” 他有一些JavaScript的伟大的文章 ,我会强烈建议阅读究竟JavaScript是。 它有更多的共同点与LISP是C ++。



Answer 6:

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



Answer 7:

JavaScript是一种基于原型的编程语言(可能基于原型的脚本语言是更正确的定义)。 它采用的克隆,而不是继承。 基于原型的编程语言是面向对象编程的无类的样式。 虽然面向对象的编程语言鼓励发展的重点放在分类和关系,基于原型的编程语言鼓励将重点放在行为,然后再后分类。

“面向对象”这个词是由Alan凯在1967年,谁解释了它在2003年创造的意思

唯一的消息,当地保留和保护,国家进程的隐藏,和极端后期绑定的所有东西。 (资源)

在面向对象的编程中,每一个对象是能够接收消息,处理数据,以及将消息发送到其它对象。

对于语言是在可以包括特征的封装,模块化,多态性,和继承的面向对象的,但它不是必需的。 面向对象的编程语言使用的类通常被称为归类为基础的编程语言,但它绝不是一个必须要利用班是面向对象的。

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

结论:JavaScript是面向对象的。



Answer 8:

与大多数面向对象的语言,JavaScript的(ECMA前262第4版,反正)没有的类,但原型概念。 因此,这的确是有些主观是否称之为面向对象与否。

@eliben:维基百科说基于对象 。 那是不一样的面向对象的。 事实上, 他们对基于对象的物品的面向对象语言和基于原型的那些区别,显式调用JavaScript的不是面向对象的。



Answer 9:

JavaScript是编写面向对象的网络应用程序很好的语言。 它可以支持面向对象编程因为通过原型支持也继承属性和方法。 你可以多态,封装和多子类的范例。



Answer 10:

这当然是主观的,是一个学术问题的。 有些人认为面向对象语言中是否有实现类和继承,其他人写的改变你的生活计划。 ;-)

(不过说真的,为什么要一个面向对象的语言必须实现类?我认为对象是关键部件。您如何创建并使用它们又是另一回事。)



Answer 11:

一个很好的线索。 下面是一些资源,我喜欢。 大多数人开始了与原型,jQuery的,或前6名库(MooTools的,ExtJS的,YUI),它们具有不同的对象模型之一。 原型试图复制经典的OO,因为大多数人认为它

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

下面是我参考了很多的原型和功能的图片

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



Answer 12:

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

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

当人们断言,JavaScript是一种面向对象的编程语言,因为他们可以利用OOD这一点,那么我要问:为什么不是C的面向对象的编程语言? 重复,您可以使用以C OOD,如果你说,C是一个面向对象的编程语言,每个人都会说你,你是疯了。

我们可以把这里大量引用的关于这个话题很旧的书籍和论坛,因为这个话题是比互联网更旧:)

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

一个面向对象的编程语言必须有对象,方法,属性,类,封装,聚合,继承和多态。 您可以实现这一切的点,但JavaScript有没有他们。

一个非常说明例如:在“面向对象的JavaScript”的第6章描述10点的方式来实现“继承”。 有多少方式在Java中? 其中,在C ++? 一,和在Delphi(Object Pascal中)? 一,和在Objective-C? 一。

这是为什么不同? 由于Java,C ++,Delphi和Objective-C的设计与面向对象的想法,而不是JavaScript的。

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

无论如何,事实是,并不是所有的人都对这个话题的一些看法:)

总之,在我看来,JavaScript是在客户端层强大的语言和未来!



Answer 13:

Hanselminutes 集146看OO阿贾克斯。 这是一场精彩的表演,绝对一出好戏,帮助形成意见。



Answer 14:

MISKO Hevery做了出色的介绍谷歌技术讲座,他谈到了在JavaScript对象。 我发现这是人们一个很好的起点或者质疑在JavaScript中使用对象,或想要开始使用它们:

  • 简介JavaScript和浏览器的DOM


Answer 15:

在微软的Ajax客户端库可以很方便地在JavaScript实现OO。 它支持inharitence和接口实现。



Answer 16:

我觉得有很多人回答这个问题“不”,因为JavaScript没有实现类,在传统的面向对象的感觉。 不幸的是(恕我直言),即ECMAScript中4即将在此之前,万岁原型! :-)



Answer 17:

我认为当你可以按照相同或相似设计图案作为像Java / C#一个真正的面向对象的语言,你几乎可以把它叫做一个面向对象的语言。 某些方面有明显的不同,但你仍然可以使用非常完善的面向对象的设计pattersn。



Answer 18:

JavaScript是基于对象的,不是面向对象的。 不同的是,基于对象的语言不支持继承正确的,而面向对象的人做的。

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



Answer 19:

在JavaScript一切都是对象 - 类对象,函数是对象,数字对象,对象的对象的对象。 这不是严格有关键入其他语言,但它绝对可以写OOP JS。



Answer 20:

JavaScript是不是典型地认为,这主要是由于缺乏真正的继承的面向对象的语言,DUCK打字允许继承/多态性与Object.prototype中允许复杂的功能分担沿半真实的形式。 在它的心脏却缺乏继承导致弱多态性发生的,因为鸭子类型会坚持具有相同属性的名称有些对象是哪些,他们不打算用作对象的实例。 因此添加属性随机对象转换成在某种意义上说它们的类型的基础。



Answer 21:

技术上讲,它是一种原型的语言,但它很容易到二OO它。



Answer 22:

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



Answer 23:

是的。 但是,它不支持所有的人会期望在缺乏继承和多态的面向对象编程语言的功能。 这并不意味着,但是,你不能模拟通过原型系统,是avaialble的语言这些功能。



Answer 24:

在JavaScript对象直接从对象继承。 有什么方法可以更面向对象?



Answer 25:

对于我个人OOP编程的主要吸引力是有自我包含的类与未曝光(私人)内部运作的能力。

什么混淆我在Javascript没有尽头的是,你甚至不能用函数名,因为你运行任何你正在使用的外部库具有相同的函数名其他地方的风险。

即使一些非常聪明的人已经找到解决办法了这一点,是不是很奇怪的是一个和Javascript在其最纯粹的形式要求你创建的代码是非常难读?

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



Answer 26:

JavaScript是面向对象?

答:是的

它可以包含在对数据进行操作的数据和方法的对象。 对象可以包含其他对象。

  • 它没有类,但它确实有构造函数来做类的事情,包括作为类的变量和方法。
  • 它没有面向类的继承,但它确实有面向原型的继承。

构建对象系统的两大主要方法是继承(is-a)和聚合(has-A)。 这两者JavaScript都有,但是它的动态特性使其在聚集出类拔萃。

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

但事实证明, JavaScript对象可以拥有私有变量和私有方法。 (点击这里了解如何。)当然,很少有人知道这一点,因为JavaScript是世界上最被人误解的编程语言。

有些人认为JavaScript不是真正的面向对象的,因为它没有提供继承。 但事实证明, JavaScript不但支持经典的继承,但其他的代码重用的模式也是如此。

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



Answer 27:

我会说,它有能力似乎OO。 特别是如果你利用它的创建现有对象的方法(在某些语言匿名方法)的能力。 像jQuery的客户端脚本库(jquery.com)或原型(prototypejs.org)是利用这图书馆的很好的例子,使得JavaScript的表现相当OO-等。



文章来源: Is JavaScript object-oriented?