JavaScript有类吗?


71

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


在上面的示例中,它讨论的是类Rectangle,因此定义一个类不再需要使用function关键字,即(function Rectangle(dimensions){}?现在有一个用于类的class关键字?
Roxy'Pro

我发现了这个reddit主题,该主题为人们提供了很多关于该主题的观点。大多数人似乎在说es6类算作真正的类,但是当然存在一些矛盾的观点。:谁想要下潜得更深一些到这个问题,并开发自己的意见可以采取偷看reddit.com/r/javascript/comments/8q6267/...
斯科蒂·贾米森

Answers:


101

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

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


4
您可以使用原型来模拟类,也可以使用类来原型,例如,看一下原型设计模式。
加布里埃尔·Ščerbák,2010年

我想我已经赚到了五分钱!好人史蒂夫
甘油

2
@ SteveHarrison,ECMAScript 2015中引入的JavaScript类主要是对JavaScript现有的基于原型的继承的语法糖。因此,这意味着javascript正在成为基于类的语言吗?
Roxy'Pro

是的,作为Java开发人员,我经常向人们指出这一点。Javascript具有“ OBJECTS”,但没有类。人们所谓的“阶级”实际上是一个对象。
Orubel

尽管ES6类主要是语法糖,但是任何想忽略它们不是真实的人都必须小心,不要使用也会将类排除在其他动态语言之外的参数。Javascript类与python类一样真实。
Scotty Jamison

23

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是否有类?” 我说过“ 2015年ECMA脚本6中引入了js中的类”。此恕我直言为问题提供了更新的答案……不是吗?同时,我的回应是尝试与其他开发人员“交流”有关他们对这种新EC6情况的看法。可能是我错了,在这种情况下,我为自己的错误感到抱歉。
威利·旺卡

1
我可以谦虚地问为什么要投反对票,以便我可以从自己的错误中学习吗?提前Tnx。
威利·旺卡

我还没有投反对票。我想这是因为旗帜。通常他们是元凶。等待一两天。其他域专家将看到您的帖子并进行相应投票。不必担心这些突然的否决票。
巴尔加夫Rao

2
@Bhargav Rao Ah好吧,我不是说那是您投下反对票:我并不是要指责任何人,我只是在一般地说只是希望得到一个解释,以将我的行为改善到堆栈溢出中,从而对两个人都有帮助我自己和这个社区中的其他人:我会花时间,我还是个新人; ;-)
威利·旺卡

3
您的回答有误导性。说“现在像使用其他基于类的语言(如Java)一样正确使用它们”是不正确的。Java是一种基于OO类的语言。类的实例在创建的每个实例上复制属性。JS中的“类”不过是语法上的糖,它可以用来连接链接到其他对象的对象(OLOO)-JS所基于的基本模型。OLOO模型将始终使用原型链来提供“继承”(实际上是委托),从来没有“ instance”属性的真实副本。“类”不是像真正的OO语言那样是静态的。
安迪·富斯尼亚克

8

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

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


6
“在Javascript中,一切都是对象”:不正确。也有原始的值,比如undefinednull
马塞尔Korpel

虚空?javascript中是否存在空-我是as3家伙,所以……我从未在js中看到过空。
甘油

@Glycerine JavaScript中的最接近AS3的voidundefined,据我可以告诉。
Yay295 '17

7

在这里听道格拉斯·克罗克福德的讲话:
http //developer.yahoo.com/yui/theater/video.php? crockonjs-2

他在演示文稿中直接解决了您的问题:

该语言最有争议的特征是继承的方式,与实际上所有其他现代语言完全不同。大多数语言使用类–我称它们为“古典语言” – JavaScript不使用。JavaScript是免费的。它使用原型。对于那些受过经典训练并看过这种语言的人来说,他们走了:嗯,这是不足的。您没有课程,如何完成所有工作?您如何对程序的结构有信心?他们从来没有超越。但事实证明……


1
视频托管在YouTube上youtube.com/watch?v=RO1Wnu-xKoY
Wulf Solter,


3

https://github.com/getify/You-Dont-Know-JS上的You-Dont-Know-JS书中

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

...

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

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

我不打算复制和过去在这里等部位,但建议你阅读第3章第四章和运行样品。

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


1
很好的参考!
亚当


2

当我想到类时,我想到的是类型以及类允许我定义新类型的事实。在js中,您无法创建新类型。您可以使用原型来做各种花哨的东西,但实际上一切仍然是对象的事实确实使js的无类本质成为现实。我认为在谈论js时使用“类”术语的人们甚至比丑陋的新运算符更容易将js当作原型语言而不是js当作经典语言。简而言之,仅仅因为js是OO并不意味着类必须存在。


1

为了补充其他答案,javascript没有类,尽管我开始看到其中的描述类似于类的语句,但我认为这只会使问题感到困惑。

JavaScript具有原型,而不是类,但是它们完成相同的事情,原型是定义对象的对象,因此造成混淆。

原型表示类将在Java中管理的私有内部状态。JavaScript没有像Java中那样将内部状态放在类中并提供用于操纵行为的接口,而是公开了JavaScript程序可以直接操纵的数据结构。

这是我在主题“原型不是类”中找到的最好的描述。


0

尽管JavaScript在ES6之前没有类,但是可以通过密封对象(从而使对象不可扩展)在ES5中实现类类行为。在密封的对象中,无法添加新的属性和方法,并且属性不可配置。属性仍然可以设置和读取。我说类,因为有一个警告。密封对象的方法定义仍然可以修改。这是因为属性值仍然可以设置,除非您将所有方法属性都更改为不可写的-此时,您已经使用ES5非常接近地重现了类的行为。


0

简单来说-是的。您只需要Babel.js转译器,因为除Chrome浏览器外,所有浏览器均不支持它。JavaScript类是一种函数。使用class关键字声明类。我们使用函数表达式语法来初始化函数,并使用类表达式语法来初始化类。

这是使用函数的JavaScript类的示例:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100


-1

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100


-8

AFAIK Javascript使用原型概念,而不是OO。这意味着您不能使用OOP的典型概念,例如继承或多态性。


12
JavaScript是一种基于原型的编程语言,这意味着它一种面向对象的语言。
史蒂夫·哈里森

3
我喜欢这个网站,因为总有一些东西要学习;)
Cesar 2010年

6
继承和多态都可以在Javascript中应用。
马特2010年

1
让我感到羞耻,但是请停止对这个问题进行投票……我还年轻又傻:)
Cesar 2014年

4
这是我非官方的否决票。
科迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.