JavaScript有类吗?

Gly*_*ine 63 javascript oop class

我和朋友上周发了言.他说在JavaScript中没有类这样的东西.

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

他说"因为没有class用过的词.这不是一个阶级."

谁是对的?


作为一个笔记; 为了将来你需要一个简洁的Classy JS工具:

https://github.com/tnhu/jsface


编辑:2017年7月

ECMAScript 2015中引入的JavaScript类主要是基于JavaScript现有的基于原型的继承的语法糖.类语法没有向JavaScript引入新的面向对象的继承模型.JavaScript类提供了更简单,更清晰的语法来创建对象和处理继承.

- Mozilla ES6课程:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

Ste*_*son 91

从技术上讲,"JavaScript没有类"的说法是正确的.

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

  • 您可以使用类来使用原型和原型来模拟类,例如,查看Prototype设计模式. (4认同)
  • 尽管 ES6 类主要是语法糖,但任何想要将它们视为不真实而忽略它们的人都必须小心,不要使用也排除其他动态语言中的类的参数。Javascript 类已经变得和 Python 类一样真实。 (3认同)
  • @SteveHarrison,ECMAScript 2015中引入的JavaScript类主要是JavaScript现有的基于原型的继承的语法糖.那么这意味着javascript正在成为现在基于类的语言? (2认同)

wil*_*nka 21

Javascript是一种面向对象的编程语言,尽管如此,2015年ECMA脚本已经引入了6个类,现在使用它们就像其他类基于Java的语言一样正确.当然,正如用户codemagician在他/她的评论中所指出的,在js和java或其他"基于类"的编程语言中,类如何工作之间存在一些深刻的差异.

不过现在在js编程中可以使用例如代码:

class Animal { 
  constructor(name) {
    this.name = name;
  }


class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这与经典的基于类的语言有一些共同之处.问题仍然是浏览器支持这项刚刚开始的新技术.因此,在制作产品上使用它仍然不好.但我毫不怀疑这个问题会很快得到解决.

因此,问题仍然存在,因为js已经成为基于类的编程语言,因为这些新特性的实现,或者它仍然是一个面向对象原型的编程语言.

  • 你的回答是误导性的.说"现在像其他基于类的语言一样使用它们是正确的",这是不正确的.Java是一种基于OO类的语言.类的实例在创建的每个实例上生成_copies_属性.JS中的"类"只不过是用于连接对象链接到其他对象(OLOO)的语法糖 - 这是JS所基于的基本模型.OLOO模型将始终使用原型链来提供"继承"(实际上它是_delegation_),永远不会有"实例"属性的真正_copy_."类"不像在真正的OO语言中那样是静态的. (3认同)
  • 我可以谦虚地问一下为什么要投否决票,这样我就可以从自己的错误中吸取教训吗?提前Tnx。 (2认同)
  • @Bhargav Rao啊好吧无论如何我没有说你是不是要投票:我不是故意指责任何人,我一般都在谈论希望得到一个解释来改善我的行为进入堆栈溢出对两者都有帮助我和其他人在这个令人敬畏的社区:我会花时间,我还是新人,;-) (2认同)

Chr*_*heD 8

在Javascript中几乎所有东西都是object(对象可以从其他对象继承).它没有classes经典意义上的.

虽然您可以通过函数原型来重现传统类定义/实例化的大部分功能.

  • "在Javascript中,一切都是对象":不是这样.还有原始值,如`undefined`,`null`等. (6认同)

Chr*_*man 7

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

他在演讲中直接提出了你的问题:

该语言最具争议的特征是它的继承方式,与几乎所有其他现代语言完全不同.大多数语言使用类 - 我称之为'经典语言' - JavaScript没有.JavaScript是免费的.它使用原型.对于那些接受过经典训练并且看过这种语言的人来说,他们会去:嗯,这是有缺陷的.你没有课,你怎么能完成任何事情?你怎么能相信你的程序结构会起作用?他们永远不会过去.但事实证明......


Ali*_*ahi 5

来自https://github.com/getify/You-Dont-Know-JS的You-Dont-Know-JS

第 4 章:混合(组合)“类”对象

...

JS 已经有一些类似类的语法元素(例如 new 和 instanceof)已经有一段时间了,最​​近在 ES6 中添加了一些,例如 class 关键字。

但这是否意味着 JavaScript 实际上有类?简单明了:没有

我不会在这里复制和粘贴其他部分,但鼓励阅读第3 章和第 4 章并运行示例。

https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/this%20%26%20object%20prototypes/ch3.md

https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/this%20%26%20object%20prototypes/ch4.md