为了账号安全,请及时绑定邮箱和手机立即绑定

ES2015(ES6)`class`语法提供了哪些好处?

ES2015(ES6)`class`语法提供了哪些好处?

LEATH 2019-08-31 10:27:18
我对ES6课程有很多疑问。使用class语法有什么好处?我读到公共/私有/静态将成为ES7的一部分,这是一个原因吗?而且,是class一种不同的OOP还是它仍然是JavaScript的典型继承?我可以使用它修改它.prototype吗?或者它只是相同的对象,但有两种不同的方式来声明它。有速度的好处吗?如果你有一个像大应用程序这样的大应用程序,可能更容易维护/理解?
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

ES6类是我们今天使用的原型类系统的语法糖。它们使您的代码更简洁,自我记录,这是使用它们的理由(在我看来)。


使用Babel来转换这个ES6类:


class Foo {

  constructor(bar) {

    this._bar = bar;

  }


  getBar() {

    return this._bar;

  }

}

会给你这样的东西:


var Foo = (function () {

  function Foo(bar) {    

    this._bar = bar;

  }


  Foo.prototype.getBar = function () {

    return this._bar;

  }


  return Foo;

})();

第二个版本并不复杂,维护的代码更多。当涉及到继承时,这些模式变得更加复杂。


因为这些类编译成我们一直使用的相同原型模式,所以你可以对它们进行相同的原型操作。这包括在运行时添加方法等,访问方法Foo.prototype.getBar等。


今天ES6中有一些基本的隐私支持,虽然它基于不导出您不想访问的对象。例如,您可以:


const BAR_NAME = 'bar';


export default class Foo {

  static get name() {

    return BAR_NAME;

  }

}

并且BAR_NAME不可用于其他模块直接引用。


许多库已经尝试支持或解决这个问题,比如Backbone和他们的extends帮助器,它们采用类似方法的函数和属性的未经验证的散列,但是没有用于暴露原型继承的编组系统,不涉及原型。


随着JS代码变得越来越复杂并且代码库越来越大,我们开始发展很多模式来处理继承和模块之类的事情。IIFE用于创建模块的私有范围有很多括号和parens; 缺少其中一个可能导致一个完全不同的有效脚本(在模块可以将下一个模块作为参数传递给它之后跳过分号,这很少有用)。


tl; dr:它是我们已经做过的糖,并且在代码中明确了你的意图。


查看完整回答
反对 回复 2019-08-31
  • 2 回答
  • 0 关注
  • 880 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信