34

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

 4 years ago
source link: https://www.tuicool.com/articles/QjENjeN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

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

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

类字段声明

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

复制代码

classCounter{ 
  constructor() { 
   this.xValue =0; 
  } 
}

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

复制代码

classCounter{ 
  xValue =0;
  #yValue =0;
  constructor() { }
}

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

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

复制代码

class Counter { 
  get#x(){ return #xValue; } 
  set#x(value){ }

 #clicked(){ } 
}

类的静态特性

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

复制代码

classCustomDate{ 
 staticpublic()= {} 
 static#private() = {} 
}

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

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

原文链接:

Coming Next, JavaScript Private Class Fields & Methods


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK