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

昨天我们介绍了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内,有人做了一个调研,显示社区对于这条草案并不认同:

\\

WX20181011_105416_2x.png

\\

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

\\
  • “#”是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

\\

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值