JavaScript是面向对象的吗?
关于JavaScript是否是面向对象的语言存在一些疑问。甚至有这样的说法:"仅仅因为一种语言包含对象,并不能使它成为OO。"
JavaScript是一种面向对象的语言吗?
解决方案
简短的回答是。欲获得更多信息:
从维基百科:
JavaScript is heavily object-based. Objects are associative arrays, augmented with prototypes (see below). Object property names are associative array keys: obj.x = 10 and obj["x"] = 10 are equivalent, the dot notation being merely syntactic sugar. Properties and their values can be added, changed, or deleted at run-time. The properties of an object can also be enumerated via a for...in loop.
另外,请参阅有关Java OOP的系列文章。
Javascript是一种多范式语言,它支持过程式,面向对象(基于原型)和函数式编程样式。
这是一篇讨论如何用Java进行OO的文章。
JavaScript是编写面向对象的Web应用程序的一种非常好的语言。它可以支持OOP,因为通过原型以及属性和方法支持继承。我们可以具有多态性,封装和许多子分类范例。
语言不需要完全像Java那样表现为面向对象。 Javascript中的所有内容都是对象。与C ++或者更早的Java相比,后者在某种程度上被广泛认为是面向对象的,但仍基于原语。多态性在Javascript中不是问题,因为它根本不关心类型。语法不直接支持的唯一核心OO功能是继承,但是可以轻松实现,但是程序员希望使用原型:这是一个这样的示例。
Microsoft Ajax客户端库使在javascript中实现OO变得简单。它支持骚扰和接口实现。
我认为很多人回答这个问题"否",因为从传统的OO角度讲,JavaScript不实现类。不幸的是(IMHO),这是ECMAScript 4中引入的。 :-)
我会说它具有看似面向对象的功能。特别是如果我们利用它的功能,可以在现有对象上创建方法(某些语言中的匿名方法)。客户端脚本库(例如jquery(jquery.com)或者原型(prototypejs.org))是利用此库的很好的示例,使javascript的行为类似于OO。
这当然是主观的,也是一个学术问题。有些人争辩说OO语言是否必须实现类和继承,而其他人则编写改变生活的程序。 ;-)
(但实际上,为什么OO语言必须实现类?我认为对象是关键组件。如何创建和使用它们是另一回事。)
与大多数面向对象的语言不同,JavaScript(无论如何,在ECMA 262 Edition 4之前)没有类的概念,而是原型。因此,是否称其为面向对象的确确实有些主观。
@eliben:维基百科说基于对象。这与面向对象不同。实际上,他们关于基于对象的文章区分了面向对象的语言和基于原型的语言,显式地将JavaScript称为非面向对象的JavaScript。
我认为,当我们可以遵循与像Java / C#这样的真正的OO语言相同或者相似的设计模式时,我们几乎可以将其称为OO语言。某些方面显然有所不同,但是我们仍然可以使用非常完善的OO设计模式。
JavaScript是基于对象的,而不是面向对象的。区别在于基于对象的语言不支持适当的继承,而面向对象的语言则支持。
有一种方法可以在JavaScript中实现"常规"继承(请参见此处),但是基本模型基于原型。
javascript中的一切都是对象类,是对象,函数是对象,数字是对象,对象是对象对象。输入类型不像其他语言那么严格,但是绝对可以编写OOP JS。
Hanselminutes第146集着眼于OO Ajax。这是一个很好的节目,而且绝对是一个有助于形成意见的好节目。
是的。但是,它不支持人们在缺乏继承和多态性的面向对象编程语言中期望的所有功能。但是,这并不意味着我们无法通过语言可用的原型系统来仿真这些功能。
IMO(这只是一种意见),面向对象语言的主要特征是它将支持多态。几乎所有动态语言都可以做到这一点。
下一个特征是封装,这在Javascript中也很容易做到。
但是,在许多人的心中,继承(特别是实现继承)将在某种语言是否符合被称为面向对象的语言方面取得平衡。
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实现它。
Javascript不是通常所考虑的面向对象语言,主要是由于缺乏真正的继承,DUCK类型允许继承/多态的半真实形式,而Object.prototype则允许复杂的功能共享。然而,从根本上说,缺乏继承会导致弱多态性发生,因为DUCK类型将坚持将某些具有相同属性名称的对象作为对象的实例,而不打算将其用作对象。因此,将属性添加到随机对象将以某种方式转换其类型的基础。
JavaScript是面向对象的,但不是Java,C ++,C#等基于类的面向对象的语言。基于类的OOP语言是较大的OOP语言家族的子集,还包括基于原型的语言,如JavaScript和自我。
从技术上讲,它是一种原型语言,但是使用OO则很容易。
它是面向对象的,但不是基于类的,而是基于原型的。
是的,没有。
正如道格拉斯·克罗克福德(Douglas Crockford)所说,JavaScript是"世界上最容易被误解的编程语言"。他有一些关于JavaScript的精彩文章,我强烈建议阅读有关JavaScript到底是什么的内容。与LISP相比,C ++具有更多的共同点。
JavaScript是一种基于原型的编程语言(可能是基于原型的脚本语言更正确的定义)。它采用克隆而不是继承。基于原型的编程语言是一种不带类的面向对象编程的样式。面向对象的编程语言鼓励将开发重点放在分类法和关系上,而基于原型的编程语言则鼓励首先关注行为,然后再进行分类。
面向对象一词由Alan Kay在1967年提出,他在2003年将其解释为
only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. (source)
在面向对象的编程中,每个对象都能够接收消息,处理数据并将消息发送到其他对象。
对于面向对象的语言,可以包括封装,模块化,多态性和继承等功能,但这不是必需的。利用类的面向对象的编程语言通常被称为基于分类的编程语言,但是决不是必须要使类成为面向对象的。
JavaScript使用原型定义对象属性,包括方法和继承。
结论:JavaScript是面向对象的。
这是一个很好的线程。这是我喜欢的一些资源。大多数人从原型,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?
JavaScript中的对象直接从对象继承。什么可以更面向对象?
我正在从另一个角度回应这个问题。
这是一个永恒的话题,我们可以在许多论坛上展开一场激烈的战争。
当人们断言JavaScript是一种OO编程语言,因为他们可以与此同时使用OOD时,我会问:为什么C不是OO编程语言?重复一遍,我们可以对C使用OOD,并且如果我们说C是一种OO编程语言,那么每个人都会说我们疯了。
我们可以在非常古老的书籍和论坛中放很多关于此主题的参考,因为该主题比Internet年代久远:)
JavaScript多年没有变,但是新的程序员希望展示JavaScript是一种OO编程语言。为什么? JavaScript是一种功能强大的语言,但不是OO编程语言。
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是一种强大的语言,并且是客户端层的未来!