JavaScript有类吗?

时间:2010-05-02 08:37:26

标签: 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

12 个答案:

答案 0 :(得分:88)

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

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

答案 1 :(得分:21)

Javascript是一种面向对象的编程语言,然而在2015年,ECMA脚本已经引入了6个类,现在使用它们就像其他类基于Java的语言一样正确。当然正如用户codemagician在他/她的评论中指出的那样,在js和java或其他基于类的#34;编程语言。

然而现在在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由于这些新功能的实现而成为基于类的编程语言,或者它仍然是面向对象原型的编程语言,那么问题仍然存在。

答案 2 :(得分:8)

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

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

答案 3 :(得分:7)

在这里听Douglas Crockford的演讲:
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2

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

  

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:2)

当我想到类时,我会想到类型以及类允许我定义新类型的事实。在js中,您无法创建新类型。你可以用原型做各种各样的花哨的事情,但事实上一切都仍然是一个对象真正击中了js的无类别性质。我认为人们在谈论js时使用“类”术语会混淆js作为原型语言而js作为一种经典语言甚至比丑陋的新运算符更令人困惑。简而言之,仅仅因为js是OO并不意味着类需要存在。

答案 6 :(得分:1)

要添加其他答案,javascript没有类,虽然我开始看到它被描述为类似于类的语句,但我相信这只会混淆问题。

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

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

这是我在该主题Prototypes are not Classes上找到的最佳描述。

答案 7 :(得分:1)

摘自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/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

答案 8 :(得分:0)

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

答案 9 :(得分: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

答案 10 :(得分:-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

答案 11 :(得分:-9)

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