JavaScript 即将加入私有字段和私有方法

发布于:2019 年 10 月 15 日 16:20

JavaScript即将加入私有字段和私有方法

尽管 JavaScript 在 2015 年就有了类,但仍然没有私有字段和私有方法。由于 TC39 委员会内部存在分歧,这些功能在最初版本中被取消。有三个规范草案打算在不久的将来将这些功能引入到 JavaScript 类中。

一旦这些规范被正式接受,就可以使用“#”符号来定义私有字段和私有方法。之所以决定使用‘#’符号而不是传统的下划线“_”,是为了避免对现有库造成太大影响,现在的库已经使用下划线来标记私有字段。

尽管现有的库使用下划线将字段或方法标记为私有,但开发人员仍然可以访问它们。将这些变量变成真正的私有可能会破坏很多现有的应用程序,从而降低新规范的采用速度。

React 中的一些东西可以用来说明这个问题。React 是一个流行的 JavaScript 框架,它不得不使用一些直白的变量名来阻止开发人员使用它们(尽管这些变量名被标记为私有),比如“_SECRET_DOM_DO_NOT_USE_ORYOU_WILL_BE_FIRED”。

TC39 的每个提案分别与类私有字段和私有方法的某个方面有关。不过将它们作为一个整体提案应该是没问题的,因为它们很可能同时被添加到 JavaScript 中。提案内容如下:

类字段声明

目前在 JavaScript 中还不能直接定义类字段,开发人员是在构造函数中定义这些字段的。

复制代码
class Counter
  constructor() { 
    this.xValue = 0
  } 
}

该提案增加了直接在类中定义公共和私有字段的能力。

复制代码
class Counter
  xValue = 0;
  #yValue = 0;
  constructor() { }
}

类的私有方法和 GETTER/SETTER 方法

该提案与私有方法的添加和私有 getter/setter 的使用有关。

复制代码
class Counter { 
  get #x() { return #xValue; } 
  set #x(value) { }
  #clicked() { } 
}

类的静态特性

该提案定义了私有和公共静态字段 / 方法的使用方式。

复制代码
class CustomDate { 
  static public() = {} 
  static #private() = {} 
}

需要注意的是,过度使用私有字段和私有方法可能会对代码库造成不利影响。私有方法不能使用单元测试进行测试,并且通常带有单一职责原则固有的问题。

私有字段和私有方法还没有正式被 JavaScript 接受,但开发人员已经可以在 Babel 中使用它们了。TypeScript 的实现版本目前正在开发当中,未来会发布。

原文链接

Coming Next, JavaScript Private Class Fields & Methods

阅读数:1810 发布于:2019 年 10 月 15 日 16:20

更多 编程语言、前端、JavaScript 相关课程,可下载【 极客时间 】App 免费领取 >

评论 (2 条评论)

发布
用户头像
很奇怪。。。typescript 一开始就有private,public 还有protected 字段。不管如何定义,编译到的es5的版本的js,都可以参与单元测试的吧。
2019 年 10 月 16 日 20:10
回复
typescript只是在自己的环境下,自己特色的东西才有对应的限制,如果编译成标准js后一样要符合js的标准,所有ts的特性就是失效的,并不冲突呀
2019 年 11 月 11 日 15:02
回复
没有更多评论了
  • JavaScript 对象:我们真的需要模拟类吗?

    在新的ES版本中,我们不再需要模拟类了:我们有了光明正大的新语法。

    2019 年 1 月 31 日

  • TC39 敲定 ECMAScript 2018 特性集

    1月23日至25日的TC39会议敲定了ES2018的特性集。ES2018是对ECMAScript语言规范的最新修订。这次更新中新添加的特性包括异步迭代器、用于对象解构(Object Destructuring)和对象字面量(Object Literal)的rest和spread操作符,并大幅改进了正则表达式。此外,还对Promise和模板字面量(Template Literal)做了进一步改进。

    2018 年 2 月 6 日

  • C# 8.0 先睹为快

    在MSDN Channel 9中,Mads Torgersen先行通过视频展示了C# 8的四个特性,包括可空的引用类型、异步流等。

    2017 年 8 月 24 日

  • ES6 令人激动的特性

    Nick Justice是GitHub开发者计划的一员。早在ES6语言标准发布之前,他就借助像Babel这样的转译器以及最新版本的浏览器在自己的项目中使用ES6特性。他认为,ES6的新特性将极大地改变JavaScript的编写方式。近日,他在一篇博文中介绍了ES6多项令人激动的特性,包括Promises、块作用域、箭头函数等。

    2015 年 7 月 10 日

  • Object.setPrototypeOf(x, null):连 Brendan Eich 都认错,但 null 值还活着

    如果仔细思考JavaScript的类型系统,你会发现null值的出现是有一定的道理的。

    2019 年 12 月 23 日

  • 接口规范,是协作的合约

    对于接口规范,我们要有意识地使用下面的这条原则:接口规范是使用者和实现者之间的合约。

    2019 年 2 月 1 日

  • Facebook 在 Reason 3 中对 ReasonML 的语法做了重大修改

    Facebook试图通过Reason将OCaml的安全性和运行速度带给JavaScript开发人员。该语言达到了3.0版本,引入了新的语法,修复了许多Bug。

    2017 年 11 月 13 日

  • 小程序 JavaScript 实现

    2018 年 3 月 30 日

  • LispyScript:让 JavaScript 支持宏!

    与其它类Lisp语言不同,不支持宏是JavaScript与生俱来的一个问题,这是因为宏会在编译时操作语法树,而这在像JavaScript这样的语言中几乎是不可能的。LispyScript是一种采用Lispy语法、支持宏的JavaScript实现。

    2015 年 6 月 11 日

  • jQuery 3.0 Alpha 版本发布,开发人员需要在升级前充分测试

    jQuery 3.0 alpha版本已发布,它带来了许多破坏性的变化。jQuery团队希望社区能够就部分修改建议提供反馈,而开发人员需要在他们现有的代码上测试升级后的库。

    2015 年 7 月 17 日