关于javascript:类在基于原型继承的语言中使用

class use in a prototypal inheritance-based language

下面这个问题的答案很好地解释了classical inheritanceprototypal inheritance之间的区别。这是我感兴趣的,因为我开始在Java中工作,但是移到JavaScript。

在他的回答中,他对prototypal inheritance说,"所有关于课程的事情都消失了。如果你想要一个对象,你只需要写一个对象。"

然而,关于如何用JavaScript"编写类"有很多文档和问题。

为什么要让语言变得与众不同。我在寻找在JS应用程序中使用类在这个原型语言中更为明智的具体例子,以及将方栓笨拙地安装到圆孔中的好处。正如Aravind所说,为什么人们通过与其他人比较来学习JavaScript,而不是按照预期……为什么这种做法似乎受到鼓励?

底线问题:为什么在EcmaScript 6中引入类?


群众喜欢阶级。

原型继承没有什么"多"或"少"的自然现象,这完全是主观的。JS是它自己的语言,就像smalltalk和self对于它是一个对象的意义有不同的想法。

ES6类是句法糖。它们规范化/清理继承/etc在JS中的使用方式。

与coffeescript类似,他们试图标准化面向对象编程在JS中是如何完成的,并使那些不习惯于原型继承的人更熟悉它。


Why are people learning Javascript by comparing it to others, and not
as it was intended?

这就进入了认知和学习理论,但简而言之的是,人类喜欢熟悉的事物,而我们学习的方式之一是将新观念与我们已有的知识联系起来。

Why are classes being introduced in ECMAScript 6?

实际上,在ECMAScript 4中几乎引入了类。我认为OOP是编写复杂软件的有用模式,而且基于类的继承比基于原型的继承更熟悉许多程序员。我认为一个同样有效的问题可能是"为什么JavaScript仍然实现基于原型的继承,当大多数学习它的人会更喜欢基于类的继承?"

如果您想知道JavaScript中的类可能是什么样子,请看一看ActionScript3,它是基于EMcascript4的草稿和基于类的继承的。

当然,仅仅因为ecmascript添加了类支持并不意味着javascript会,或者至少它会很快出现。


我发现Zakas的这篇文章很清楚地解释了这一点,它只是语法上的糖分,到最后,javascript也会以同样的方式工作。

不要担心必须学习课程或者改变你的编程风格,什么都不会改变。:)


为什么ES6中会引入课程?糖,属于各种句法。


对于面向对象语言(如Java)来JavaScript的人来说,类是非常好的。

这是我已经做过几次的经历。我有许多J2EE Web项目,它们具有良好的Java开发团队,他们拥有一些JavaScript知识,但并不多。我做的第一件事就是解释原型、原型继承以及如何使用原型实现OOP范式——基本上是伪经典继承。(现在我几乎在每一个项目中都会为Java开发人员做一个JavaScript。

通过这种方法,我基本上看到了很好的代码。大多数Java开发人员倾向于坚持伪古典模式,并且对它非常满意。这可能不是JS Ninjas会写的,但坦率地说,我不在乎。代码易于理解和维护,人们有一个良好的学习曲线,并且生产非常快。


原型语言,如javascript,对于不需要大量测试或维护的小规模、短期项目来说是非常好的。它们的简单和灵活的功能在这个领域中非常引人注目。

另一方面,基于类的语言趋向于更严格一些,需要更多的设置,这在小东西上没有那么好,但是额外的结构有助于保持更大的长期项目的可伸缩性和可管理性。

当JavaScript第一次启动时,它的主要功能是操纵静态的DOM元素,这对于原型语言来说是一个很好的应用程序。快速、灵活和简单——不必大惊小怪。然而,现在,javascript所扮演的角色比简单的脚本复杂得多,而且越来越像一个应用程序。向原型语言中添加类听起来有点滑稽,但是添加的结构类提供了,加上它们广泛的熟悉性,可以很容易地帮助开发人员团队处理现代JavaScript应用程序的复杂性。