微信号:frontshow

介绍:InfoQ大前端技术社群:囊括前端、移动、Node全栈一线技术,紧跟业界发展步伐。

JavaScript私有属性要来了,但实现方式惹争议

2018-10-11 12:04 前端之巅
作者|徐川
编辑|覃云

昨天我们介绍了 JavaScript 的三个新特性,现在,一个广受期待的新特性:私有属性也离我们越来越近了。

昨天,TC39 在 GitHub 上通过了一条 EMCAScript 语法特性的草案,即类私有属性修饰符“#”,不过,该特性之前在社区的调研中遭遇了大量反对。

该修饰符的使用方式如下:

class Counter extends HTMLElement {
  #x = 0;

  clicked() {
    this.#x++;
    window.requestAnimationFrame(this.render.bind(this));
  }

  constructor() {
    super();
    this.onclick = this.clicked.bind(this);
  }

  connectedCallback() { this.render(); }

  render() {
    this.textContent = this.#x.toString();
  }
}
window.customElements.define('num-counter', Counter);

类的私有属性和方法使用“#”前缀作为修饰符,即代表该属性或方法作用域仅限于类的块级作用域内,你不能在之外对其进行引用。

该语法引起了社区大量反对,在该语法草案的一个 issue 内,有人做了一个调研,显示社区对于这条草案并不认同:

社区对这条草案的主要担忧包括:

  • “#”是 CSS 中的 id 选择器,在 JS 中作为私有属性修饰符可能引起混乱,降低代码可读性;

  • “#”在部分编程语言里是作为注释的语法,JS 里使用它会引起混乱;

  • TypeScript 之前已经实现过私有属性,其修饰符为private,现在实现不一致造成认知负担。

这一草案早在 2017 年 7 月已进入 stage 3 状态,要改变是很艰难的,TC39 委员会之所以通过,是因为他们认为对于这一草案,委员会和社区已经达成共识,即使有开发者认为这一共识并不存在。

而委员会反对上面调研结果的理由是认为在 GitHub issue 去的该调研吸引的反对者偏多,该草案的赞同者大多不会到 issue 区表达意见。

另还有委员会成员在该 issue 下回答之所以不采用和 TypeScript 相同的实现,是要刻意与 TypeScript 保持不同,以免偏离 JS 的发展方向。

 延伸阅读
  • https://github.com/tc39/proposal-class-fields

  • https://github.com/tc39/proposal-class-fields/issues/100

  • https://github.com/tc39/proposal-class-fields/pull/140

亲爱的读者,对于这条特性你是支持还是反对呢?欢迎投票,以及在评论区留下你的看法。

 活动推荐

前端发展至今,社区中出现了很多高质量的框架与解决方案,在有限的研发资源下,团队需要尽可能多地使用社区的方案解决问题。12 月 7-8 日在北京国际会议中心举办的 ArchSummit 全球架构师技术峰会邀请了超过百位的国内外专业讲师,并设置了前端技术专题,分享他们的最新黑科技和研发经验。

目前大会 8 折优惠购票火热进行中,扫描以下图片二维码或点击“阅读原文”了解更多详情!

如有疑问欢迎咨询票务经理灰灰:17326843116(微信同号)

 
前端之巅 更多文章 这三个新特性可能改变JavaScript未来 正则表达式真的很6,可惜你不会写 为什么说ReasonReact是编写React的最佳方式? 过来留言,有书相送! Create React App 2.0正式版发布,不再支持 Node 6
猜您喜欢 2016年10月20日,三分钟全球能源资讯(最及时,最全面) PullRefreshView Web性能分析 钉钉逼出最强企业微信,移动办公市场正迎来一场「人民战争」 一个错别字100块钱?