关于JavaScript是否是面向对象的语言存在一些问题.甚至一句话,"只是因为一种语言有对象并不能成为OO".
JavaScript是面向对象的语言吗?
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是基于对象的.对象是关联数组,用原型进行扩充(见下文).对象属性名称是关联数组键:obj.x = 10和obj ["x"] = 10是等价的,点符号只是语法糖.可以在运行时添加,更改或删除属性及其值.也可以通过for ... in循环枚举对象的属性.
另外,请参阅这一系列关于使用Javascript进行OOP 的文章.
Javascript是一种多范式语言,支持过程,面向对象(基于原型)和函数式编程风格.
这是一篇讨论如何在Javascript中执行OO 的文章.
语言不需要像Java那样表现为面向对象.Javascript中的所有内容都是一个对象; 与C++或更早的Java相比,它们在某种程度上被广泛认为是面向对象的,但仍然基于原语.多态性在Javascript中不是问题,因为它根本不关心类型.语法不直接支持的唯一核心OO功能是继承,但是程序员想要使用原型可以轻松实现:这是一个这样的例子.
JavaScript是面向对象的,但不是基于类的面向对象语言,如Java,C++,C#等.基于类的OOP语言是更大的OOP语言系列的一个子集,它还包括基于原型的语言,如JavaScript和自我.
是的,不是.
正如Douglas Crockford所说,JavaScript是" 世界上最容易被误解的编程语言".他有一些关于JavaScript的精彩文章,我强烈建议您阅读JavaScript究竟是什么.它与LISP有更多共同之处就是C++.
JavaScript是一种基于原型的编程语言(可能是基于原型的脚本语言更正确的定义).它采用克隆而不是继承.基于原型的编程语言是一种没有类的面向对象编程风格.虽然面向对象编程语言鼓励开发专注于分类和关系,但基于原型的编程语言鼓励首先关注行为然后再进行分类.
"面向对象"一词是由Alan Kay于1967年创造的,他在2003年解释了这一点
只有消息传递,本地保留和保护以及隐藏状态进程,以及所有事物的极端后期绑定. (资源)
在面向对象的编程中,每个对象都能够接收消息,处理数据和向其他对象发送消息.
对于面向对象的语言,可能包括封装,模块化,多态和继承等功能,但这不是必需的.使用类的面向对象编程语言通常被称为基于类的编程语言,但使用类是面向对象的并不是必须的.
JavaScript使用原型来定义对象属性,包括方法和继承.
结论:JavaScript是面向对象的.
与大多数面向对象语言不同,JavaScript(无论如何,在ECMA 262 Edition 4之前)没有类的概念,而是原型.因此,是否将其称为面向对象确实有点主观.
@eliben:维基百科说基于对象.这与面向对象不同.实际上,他们关于基于对象的文章区分了面向对象的语言和基于原型的语言,显式地调用JavaScript 不是面向对象的.