JavaScript有类吗?

上个星期我和一个朋友吵了一架。 他表示,在JavaScript中没有类。

我说那里有你可以说var object = new Object()

他说:“因为没有使用任何单词,这不是一个阶级。”

谁是对的?


作为一个说明; 以后你需要一个简洁的Classy JS工具:

https://github.com/tnhu/jsface


编辑:2017年7月

在ECMAScript 2015中引入的JavaScript类主要是基于JavaScript现有基于原型的inheritance的语法糖。 类语法没有为JavaScript引入一个新的面向对象的inheritance模型。 JavaScript类提供了一个更简单,更清晰的语法来创build对象并处理inheritance。

– Mozilla ES6类: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

从技术上讲,“JavaScript没有类”的说法是正确的。

虽然JavaScript是面向对象的语言,但它不是一个基于类的语言,它是一种基于 原型的语言 。 这两种方法之间存在差异,但是由于可以像使用基于类的语言一样使用JavaScript,因此很多人(包括我自己)通常只是将构造函数称为“类”。

这是一个与ECMA 6相匹配的小更新。

js中的类已经在2015年的ECMA脚本6中引入,现在正确地将它们用于像Java这样的其他基于类的语言。 当然有一些差异。 但现在在js编程中可以使用例如下面的代码:

 class Animal { constructor(name) { this.name = name; } class Dog extends Animal { speak() { console.log(this.name + ' barks.'); } } 

来源: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

这与传统的基于类的语言有一些共同之处。 问题依然是刚刚开始的这项新技术的浏览器支持。 所以在产品上使用它还是不好的。 但是我毫不怀疑这个问题会很快得到解决。

因此,如果js已经成为基于类的编程语言,这是因为这个新特性的实现还是仍然是一个面向对象原型的编程语言。

编辑

正如Codemagician在他/她的评论中指出的那样,在js,java或其他“基于类”的编程语言中,类是如何工作的,有一些深刻的区别。

在Javascript中几乎所有东西都是一个object (对象可以从其他对象inheritance)。 它没有古典意义上的classes

虽然您可以通过函数原型重现传统类定义/实例的大部分function。

请听Douglas Crockford的话:
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2

他在演讲中直接回答你的问题:

这种语言最有争议的特征就是它的inheritance方式,它与几乎所有其他现代语言完全不同。 大多数语言使用类 – 我称之为“古典语言” – JavaScript不。 JavaScript是免费的。 它使用原型。 对于那些看过这门语言的经典训练的人,他们会这样认为:这是不足的。 你没有课,你怎么能做到? 你怎么能有信心,你的程序的结构将工作? 他们从来没有超过这个。 但事实certificate…

通过“语言X有class”人们通常意味着支持面向对象的编程。

是的,Javascript是一种面向对象的语言。

当我想到类时,我想到types和类允许我定义新types的事实。 在JS你不能创build新的types。 你可以用原型做各种各样的幻想,但事实上,一切仍然是一个对象,真正打击了js的无阶级本质。 我认为,在讨论js时,使用'class'术语的人甚至比丑陋的新操作员还要混淆js作为原型语言,js作为古典语言。 总之,仅仅因为js是面向对象并不意味着类需要存在。

为了增加其他的答案,JavaScript没有类,虽然我开始看到它被描述为像类的东西,但我相信只是混淆了这个问题。

JavaScript有原型,而不是类,但他们完成同样的事情,原型是定义对象的对象,因此混乱。

原型是一个私有的内部状态的表示,例如一个类将在Java中pipe理。 JavaScript中并没有将这个内部状态放在一个类中,而是提供了一个操作行为的接口,就像在java中一样,JavaScript公开了JavaScript程序的数据结构来直接操作。

这是我在这个主题上find的最好的描述, 原型不是类 。

尽pipeJavaScript在ES6之前没有类,但类似于类的行为可以通过密封对象(从而使对象不可扩展)在ES5中实现。 在密封对象中,不能添加新的属性和方法,并且属性是不可configuration的。 属性仍然可以设置和读取。 我说class级,因为有一个警告。 密封对象的方法定义仍然可以修改。 这是因为属性值仍然可以设置,除非您将所有方法属性更改为不可写 – 此时您已经使用ES5非常精确地复制了类的行为。

AFAIK JavaScript使用原型的概念,它不是面向对象。 这意味着你不能像inheritance或多态这样使用OOP的典型概念。