【问题标题】:Classes in JavaScript ECMAScript 5?JavaScript ECMAScript 5 中的类?
【发布时间】:2015-08-09 19:31:42
【问题描述】:

我想知道 JavaScript ECMAScript 5 中是否有类?我读了一些文献,对此有不同的看法。我知道可以模拟类,但我不确定它们是否称为类。您是否也有一些证据?

这些类仅仅是伪类还是它的正确术语是什么?

【问题讨论】:

  • 当你在 ES2015 (ES6) 中使用 class 时,你并没有做任何你在 ES5 中做不到的事情——你只是在用更少的输入来完成它。所以答案是肯定的,ES2015 有类,ES5 也有类。
  • BI 知道可以重建类并模拟它们。但是它们真的已经是编程语言的一部分了吗?在 EMCA 官方网站上,它说“ECMAScript 不使用 C++、Smalltalk 或 Java 中的类。”。
  • ECMA 可能指的是基于原型而不是基于继承的 Javascript 类。
  • class 只是 ES5 中常见模式的语法糖。它没有为语言添加任何新的语义,并且使用class 关键字定义类在语义上与在 ES5 中通过创建原型然后向该原型添加方法等来定义类相同。 ES5 中的类和 ES2015 中的类是相同的,只是在 ES2015 中声明一个类需要更少的输入。 JavaScript 类不同于 Java 类,但 Java 类也不同于 C++ 类或 Smalltalk 类。
  • @Jordan,Java 类也不同于 C++ 类。您指的是泛型还是模板?因为在其他方面,Java 类与 C++ 类的相关性比 Javascript 类更多。

标签: javascript class ecmascript-5


【解决方案1】:

JavaScript/ECMAScript 是一种prototype-based 编程语言。

维基百科对此的定义是:

基于原型的编程是一种面向对象的编程风格,其中行为重用(称为继承)是通过克隆作为原型的现有对象的过程来执行的。这种模型也可以称为原型、面向原型、无类或基于实例的编程。

好吧,知道是否称它们为是你的决定。

但是 JS 世界中的一些人称它们为类,并且使用 ECMAScript 6 将有一个关键字来创建此类原型,称为 class。 (这意味着这些原型应该被称为class。)


既然你正在写一篇论文,你可以定义一个类(那里有一些),说明你使用了哪个以及它是否适用于 JavaScript。 (如果这以某种方式属于你的工作。)

class 的一些定义也总结在 John C. Mitchell 的一本好书中。 (米切尔,约翰:编程语言中的概念。剑桥大学出版社,2003 年。)

关于 Simula 中的,他写道:(第 326 页)

类:Simula 类是一个返回指向其激活记录的指针的过程。类的主体可以初始化它创建的对象。

关于 Smalltalk 中的,他写道:(p. 327)

类:Smalltalk 类定义类变量、类方法和类的所有对象共享的实例方法。在运行时,类数据结构包含指向实例变量 Temple、方法字典和超类的指针。

他还表示,Java 和 C++ 中的 的概念与作为 OO 先驱的 Smalltalk 中的概念非常相似。

我们可以看到 class 可以有不同的定义,但上面的两个定义似乎都不太符合 JavaScript 原型。

【讨论】:

  • 我们当然不会调用原型(对象) :-)
  • @JavaForAndroid:不,JavaScript 不是基于类的。它是基于对象的。
  • @Bergi,很遗憾得知我不是“JS 社区”的成员。请问您在哪里找到了反对在 JS 中使用“类”的明确共识?
  • @FrédéricHamidi:我并不是说 js 社区不使用“类”这个词(见上面我自己的回答),我只是说当说“类”时我们不使用参考原型对象。大多数人的意思是构造函数的完整性、原型对象、它的方法、共享继承以及与new 的用法。实现这个概念的所有因素(我承认有多种方法可以实现这个概念,所以并不总是那么清楚)
  • @JavaForAndroid 是和否。从 Java 或 C++ 程序员的角度来看,它是一个“伪类”。从 JavaScript 程序员的角度来看,它是一个类。如果您将 JavaScript 类与 Java 或 C++ 类进行比较,它们肯定是“伪类”。可以修改类,也可以修改对象,甚至删除“方法”。
【解决方案2】:

class”是许多事物的术语。您正在寻找的classes 是一个概念,并且肯定在JavaScript 中使用。我们通过具体化来实现这个概念,这很容易通过 JavaScript 强大的、面向对象的prototype inheritance 实现。该模型与其他编程语言中使用的对象模型有很大不同,在其他编程语言中,类更像是编译器工件而不是具体对象。

这个概念是通过通用语言特性实现的,这允许有多个稍微不同的实现(其中一些甚至不依赖于原型)。所以当使用“类”这个词时,我们不知道它到底是什么样子。只有当我们引用具有实现的特定类时,才清楚结构的含义(假设您熟悉实现的类型)。
然而,有一个非常标准的模式(实现),带有一个构造函数,使用new 调用以创建实例,以及一个用于共享方法的原型对象。该模式还定义了如何设置继承和子类化。

你说得对,在 ES5 中没有语法 class 结构(尽管关键字是保留的,并且在 ES6 中由标准结构实现)。

【讨论】:

    【解决方案3】:

    来自MDN

    JavaScript 是在 ECMAScript 6 中引入的,是语法上的 在 JavaScript 现有的基于原型的继承上加糖

    你可以通过一些编译器在 ES5 中使用这个新结构:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2013-10-09
      • 1970-01-01
      • 2012-02-02
      • 2017-01-27
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多