JavaScript是面向对象的吗?

JavaScript是面向对象的吗?,javascript,oop,Javascript,Oop,关于JavaScript是否是一种面向对象的语言,一直存在一些问题。即使是一句话,“仅仅因为一种语言有对象并不能使它成为OO。” JavaScript是一种面向对象的语言吗?简单的回答是肯定的。有关更多信息: 发件人: JavaScript是高度基于对象的。 对象是关联数组, 增加了原型(见下文)。 对象特性名称是关联的 数组键:obj.x=10和obj[“x”]= 10是等效的点表示法 仅仅是语法上的糖。 属性及其值可以是 在中添加、更改或删除 运行时。对象的属性 也可以通过中的for…枚举

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


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

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

发件人:

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


另外,请参阅关于使用Javascript的OOP。

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


下面讨论如何使用Javascript实现OO。

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

语言不需要像Java那样进行面向对象的操作。Javascript中的一切都是一个对象;与C++或早期java相比,它们在某种程度上被广泛认为是面向对象的,但仍然基于图元。多态性在Javascript中不是问题,因为它根本不关心类型。语法不直接支持的唯一核心OO特性是继承,但它可以很容易地实现,但程序员希望使用原型:就是这样一个例子。

使得在javascript中实现OO变得简单。它支持内在性和接口实现。

我认为很多人回答这个问题“不”,因为JavaScript没有实现传统OO意义上的类。不幸的是(IMHO),这将出现在ECMAScript 4中。在此之前,原型万岁!:-)

我想说它的功能似乎是面向对象的。尤其是当您利用它在现有对象上创建方法的能力(某些语言中的匿名方法)时。jquery(jquery.com)或prototype(prototypejs.org)等客户端脚本库都是利用这一点的库的好例子,使javascript表现得非常像OO。

这当然是主观的,也是一个学术问题。一些人争论OO语言是否必须实现类和继承,另一些人编写改变你生活的程序


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

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


@维基百科上说是基于对象的。这与面向对象不同。事实上,区分面向对象语言和基于原型的语言,显式地将JavaScript称为非面向对象语言。

我认为,当您可以遵循与真正的OO语言(如Java/C)相同或类似的设计模式时,您可以将其称为OO语言。有些方面明显不同,但您仍然可以使用非常成熟的OO设计模式。

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


JavaScript()中有一种实现“正常”继承的方法,但基本模型是基于原型的。

JavaScript中的一切都是一个对象——类是对象,函数是对象,数字是对象,对象是对象。它不像其他语言那样严格地进行键入,但编写OOP JS绝对是可能的。

Hanselminutes关注OO Ajax。这是一场精彩的演出,绝对是一场有助于形成意见的精彩演出。

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

IMO(这只是一种观点)面向对象语言的关键特征是它支持。几乎所有动态语言都这样做

下一个特性是,这在Javascript中也很容易实现

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

Javascript确实提供了一种通过原型化继承实现的相当简单的方法,但这是以牺牲封装为代价的

因此,如果面向对象的标准是典型的多态性、封装和继承三重标准,那么Javascript就不能通过

<强>编辑< /强>:补充的问题被提出:“原型继承牺牲封装?”考虑这个非原型方法的例子:-< /P>

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}
_value属性已封装,外部代码无法直接修改它。我们可以向类中添加一个mutator,以完全由类中的代码控制的方式对其进行修改。现在考虑对同一类的原型方法:-

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }
这个坏了。由于分配给getValue的函数不再在具有_值的范围内,因此无法访问它。我们需要将_值提升为
this
的属性,但这会使它在为类编写的代码的控制之外可访问,因此封装被破坏

尽管如此,我仍然认为Javascript是面向对象的