JavaScript 有类吗?

IT技术 javascript oop class
2021-02-13 07:44:24

上周我和一个朋友发生了争执。他说 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

6个回答

从技术上讲,“JavaScript 没有类”这句话是正确的。

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

是的,作为 Java 开发人员,我经常向人们指出这一点。Javascript 有“对象”但没有类。人们所说的“类”实际上是一个对象。
2021-03-20 07:44:24
您可以使用原型模拟类和使用类的原型,例如查看原型设计模式。
2021-03-23 07:44:24
我想我已经赚到了我的钱!不错的史蒂夫
2021-03-25 07:44:24
尽管 ES6 类主要是语法糖,但任何想要将它们视为不真实的人都必须小心,不要使用从其他动态语言中排除类的参数。Javascript 类已经变得和 Python 类一样真实。
2021-04-04 07:44:24
@SteveHarrison,ECMAScript 2015 中引入的 JavaScript 类主要是对 JavaScript 现有的基于原型的继承的语法糖。所以这意味着 javascript 正在成为基于类的语言?
2021-04-05 07:44:24

Javascript 是一种面向对象的编程语言,但在 2015 年 ECMA 脚本中引入了 6 个类,现在可以像 Java 等其他基于类的语言一样使用它们。当然,正如用户代码魔术师在他/她的评论中指出的那样,类在 js 和 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 是否因为实现了这个新特性而成为一种基于类的编程语言,或者它仍然是一种面向对象原型的编程语言。

@Bhargav Rao 嗨。Tnx 的评论。我并不是要争论,但问题是“JavaScript 有类吗?” 我说“js 中的类已在 2015 年的 ECMA 脚本 6 中引入”,恕我直言,这个问题给出了更新的答案......不是吗?同时,我的回应试图与其他开发人员“交流”他们对这种新 EC6 情况的看法。可能是我错了,在这种情况下,我为我的错误感到抱歉。
2021-03-19 07:44:24
我可以谦虚地问为什么要投反对票,这样我就可以从自己的错误中吸取教训吗?提前Tnx。
2021-03-21 07:44:24
我没有投反对票。我猜是因为旗帜。通常他们是罪魁祸首。等待一两天。其他领域专家将看到您的帖子并相应地投票。不要太担心这些突然的否决票。
2021-03-29 07:44:24
@Bhargav Rao 啊好吧无论如何我并没有说那是你反对投票:我不是故意指责任何人,我只是想得到一个解释来改善我的行为进入堆栈溢出对两者都有帮助我自己和这个很棒的社区中的其他人:我会慢慢来,我还是新手,;-)
2021-04-04 07:44:24
你的回答有误导性。说“现在像 Java 等其他基于类的语言一样使用它们是正确的”是不正确的。Java 是一种基于 OO 类的语言。类的实例在创建的每个实例上制作属性的副本JS 中的“类”只不过是将对象链接到其他对象 (OLOO) 的语法糖 - JS 所基于的基本模型。OLOO 模型将始终使用原型链来提供“继承”(实际上是委托),从来没有“实例”属性的真实副本“类”不像真正的面向对象语言那样是静态的。
2021-04-12 07:44:24

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

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

@Glycerine JavaScript中的最接近AS3的voidundefined,据我可以告诉。
2021-03-15 07:44:24
“在 Javascript 中,一切都是对象”:不正确。也有原始的值,比如undefinednull等等。
2021-04-07 07:44:24
空白?javascript 中是否存在 void - 我是 as3 人看...我从来没有在 js 中看到过 void。
2021-04-14 07:44:24

在这里听道格拉斯·克罗克福德 (Douglas Crockford) 的演讲:http : //developer.yahoo.com/yui/theater/video.php? v=
crockonjs-2

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

该语言最具争议的特征是它进行继承的方式,这与几乎所有其他现代语言完全不同。大多数语言都使用类——我称它们为“经典语言”——JavaScript 没有。JavaScript 是类免费的。它使用原型。对于那些受过经典训练的人来说,他们会去看看语言:嗯,这是有缺陷的。你没有课,你怎么做事?你怎么能相信你的程序结构会起作用?他们永远无法克服这一点。但事实证明……

视频托管在 YouTube youtube.com/watch?v=RO1Wnu-xKoY
2021-04-14 07:44:24

人们所说的“X 语言有类”通常是指支持面向对象编程。

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

@ndesign11 甚至不接近。拥有一流的函数并不能使 JavaScript 成为一种函数式语言。
2021-03-17 07:44:24
JS 是一种函数式语言
2021-04-09 07:44:24