Skip to content

Latest commit

 

History

History
32 lines (20 loc) · 2.7 KB

15.7.md

File metadata and controls

32 lines (20 loc) · 2.7 KB

15.7 类的优点和缺点

在 JavaScript 社区里,类是有争议的:一方面,来自基于类的语言的人很开心,因为再也不需要应对 JavaScript 的非传统继承机制。另一方面,有很多 JavaScript 程序员认为 JavaScript 中复杂的不是原型继承,而是构造器。

ES6 的类提供了几点明显的好处:

  • 兼容当前大量的代码。
  • 相对于构造器和构造器继承,类使初学者更容易入门。
  • 子类化在语言层面支持。
  • 可以子类化内置的构造器。
  • 不再需要继承库;框架之间的代码变得更加轻便。
  • 为将来的高级特性奠定了基础: traits (或者 mixins ), 不可变实例,等等。
  • 使工具能够静态分析代码( IDE ,类型检测器,代码风格检测器,等等)。

看几条关于 ES6 类的抱怨。你将会看到我赞同大多数抱怨,但是我同时认为利远大于弊。我很高兴 ES6 引入了类,并且推荐使用类。

15.7.1 抱怨: ES6 类掩盖了 JavaScript 继承的本质

是的, ES6 类确实掩盖了 JavaScript 继承的本质。类看起来的样子(语法上)和类的行为(类的语义)是没有联系的:看起来像是对象,但是是一个函数。对于类,我倾向于构造器对象,而不是构造器函数。我在 Proto.js 项目 中探索了这种方式,使用了一个小型的库(证明了使用这种方法是很有好处的)。

然而,向后兼容就有问题了,这就是为什么构造器函数也是有道理的原因。这种方式下, ES6 代码和 ES5 代码更容易相互操作。

语法和语义的不一致将会导致 ES6 和后续版本有一些阻力。但是可以简单地使用 ES6 表层的东西,由此来享受一种写代码的舒适感。我不认为这种舒适感在将来会拖累你。新手能够更快入门,然后才去学习背后的原理(在他们对语言感到更加自然之后)。

15.7.2 抱怨:类会禁锢你,因为强制性的 new

如果想实例化一个类,在 ES6 中必须要使用 new 。这意味着不能将类转换成工厂函数而不改变调用方式。确实是一个限制,但是有两个缓和的因素:

  • 你可以覆盖 new 操作符的默认结果,从类的构造器方法中返回一个对象。
  • 由于内置模块和类, ES6 使 IDE 更加容易地重构代码。因此,从新手到函数调用将会很简单。很明显,如果不控制调用你代码的代码(就像库的使用一样),这是不会对你有帮助的。

因此,类的确在语义上限制了你,但是,一旦 JavaScript 有 trait 了,类将不会在概念上限制你(关于面向对象的设计)。