当前位置:  开发笔记 > 编程语言 > 正文

JavaScript是面向对象的吗?

如何解决《JavaScript是面向对象的吗?》经验,为你挑选了8个好方法。

关于JavaScript是否是面向对象的语言存在一些问题.甚至一句话,"只是因为一种语言有对象并不能成为OO".

JavaScript是面向对象的语言吗?



1> AnthonyWJone..:

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在这方面并不是唯一的.Python也没有强制封装的机制.Python对象的所有成员都是公共的,而Python仅使用命名约定来指示成员应被视为"私有".但没人质疑Python是否是OO语言.
原型继承如何牺牲封装?
你是对的,C#不是必需的,我错过了这一点.但是,重点应该是这一点.封装不等于信息隐藏.IH是与封装相关联的概念.信息隐藏是您编辑提示的内容.封装比这更具概念性.它指的是外部世界用来与对象进行交互的内容.因此Scott Koon的问题.
OO的更为真实的定义将基于"消息传递"; 在任何OO语言中,主要设计方法是"将消息传递给其他对象"而不是"访问和修改字段".方法调用是一种流行的消息传递形式.多态性和继承不是OO的固有属性,它们只是由于静态类型的限制而必需; 封装是消息传递系统中固有的(因为你永远不会直接访问变量,只是将消息发送到其他对象),但它不是OO的主要关注点.

2> Eli Bendersk..:

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

来自维基百科:

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

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



3> jop..:

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

这是一篇讨论如何在Javascript中执行OO 的文章.



4> Eevee..:

语言不需要像Java那样表现为面向对象.Javascript中的所有内容都是一个对象; 与C++或更早的Java相比,它们在某种程度上被广泛认为是面向对象的,但仍然基于原语.多态性在Javascript中不是问题,因为它根本不关心类型.语法不直接支持的唯一核心OO功能是继承,但是程序员想要使用原型可以轻松实现:这是一个这样的例子.



5> munificent..:

JavaScript是面向对象的,但不是基于类的面向对象语言,如Java,C++,C#等.基于类的OOP语言是更大的OOP语言系列的一个子集,它还包括基于原型的语言,如JavaScript和自我.



6> David Mohund..:

是的,不是.

正如Douglas Crockford所说,JavaScript是" 世界上最容易被误解的编程语言".他有一些关于JavaScript的精彩文章,我强烈建议您阅读JavaScript究竟是什么.它与LISP有更多共同之处就是C++.



7> 小智..:

JavaScript是一种基于原型的编程语言(可能是基于原型的脚本语言更正确的定义).它采用克隆而不是继承.基于原型的编程语言是一种没有类的面向对象编程风格.虽然面向对象编程语言鼓励开发专注于分类和关系,但基于原型的编程语言鼓励首先关注行为然后再进行分类.

"面向对象"一词是由Alan Kay于1967年创造的,他在2003年解释了这一点

只有消息传递,本地保留和保护以及隐藏状态进程,以及所有事物的极端后期绑定. (资源)

在面向对象的编程中,每个对象都能够接收消息,处理数据和向其他对象发送消息.

对于面向对象的语言,可能包括封装,模块化,多态和继承等功能,但这不是必需的.使用类的面向对象编程语言通常被称为基于类的编程语言,但使用类是面向对象的并不是必须的.

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

结论:JavaScript是面向对象的.



8> Sören Kuklau..:

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

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有