TC39 在 GitHub 通过一条 EMCAScript 私有属性的草案

局长
 局长
发布于 2018年10月12日
收藏 6

近日,TC39 在 GitHub 上通过了一条 EMCAScript 语法特性的草案(JavaScript 的 Class field 声明),即类私有属性修饰符 "#"。不过,该特性之前在社区的调研中遭遇了大量反对。有关草案的详细信息,请点此查看

TC39,ECMA 的第39号技术专家委员会(Technical Committee 39,简称 TC39),负责制订 ECMAScript 标准,成员包括 Microsoft、Mozilla、Google 等大公司。TC39 的总体考虑是,ES5 与 ES3 基本保持兼容,较大的语法修正和新功能加入,将由 JavaScript.next 完成。

该类私有属性修饰符“#”的使用方式如下:

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,现在实现不一致造成认知负担。

TypeScript 开发团队也明确表示不喜欢这个语法:https://github.com/Microsoft/TypeScript/issues/16415

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

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

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

参考链接

那么问题来了,对于这项新特性你是支持还是反对呢?欢迎在评论区留下你的看法。

参考:前端之巅

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:TC39 在 GitHub 通过一条 EMCAScript 私有属性的草案
加载中

精彩评论

久永
久永

引用来自“小乔布斯”的评论

刻意为了和TypeScript不同而不同,真是傻X
说白了,就是一帮官老爷为了显示自己权利,
彰显存在感,故意制造变扭!
还说的铮铮有词的,真是“从未见过如此无耻之人”!
真TMD是白痴!“肉食者鄙!”
这帮官老爷除了资本意外,P农的话才不会理会呢,
我看能阻止这个的,只有码农们自己的实际行动了。
——坚决不用,或者我干脆直接用 TS 好了。
小乔布斯
小乔布斯
刻意为了和TypeScript不同而不同,真是傻X
老帖子

引用来自“老帖子”的评论

再丑也没有 function* 丑。。。
我已经习惯了
其实不用private也有原因的,obj.a 你能在语法上得知 a 是私有的还是公有的?
用 # 就没问题,this.#a 和 this.a 是不同的成员,前者很明确是私有变量,后者是公有的。
js是动态语言。如果用 private,必然要求js引擎在每一次成员访问时检查成员是否是公有的。然而使用#a的话js引擎在语法解析时就可以得知这条语句肯定是非法的
孤独_
孤独_
‘’#‘’是真的别扭
JinHengyu
JinHengyu
我要放弃信仰去学typescript了//

最新评论(14

J
John0King

引用来自“老帖子”的评论

再丑也没有 function* 丑。。。
我已经习惯了

引用来自“老帖子”的评论

其实不用private也有原因的,obj.a 你能在语法上得知 a 是私有的还是公有的?
用 # 就没问题,this.#a 和 this.a 是不同的成员,前者很明确是私有变量,后者是公有的。
js是动态语言。如果用 private,必然要求js引擎在每一次成员访问时检查成员是否是公有的。然而使用#a的话js引擎在语法解析时就可以得知这条语句肯定是非法的

引用来自“John0King”的评论

js 解释器,完全可以把所有 private 变量/方法 解释到一个 私有属性里面 比如 object.proptotype.____privates ,
而且 做为同为 C 系的语法, 跟 C/C++ C# 的 预编译符 冲突,再说 现在 在 Typescript 里面 已经存在了 这哥草案,纯粹是 体现他们的 存在感

引用来自“老帖子”的评论

大哥,
js的内存模型,成员变量是放到对象本身上的啊,成员函数才是放在prototype上的。。。
它这不是私有的么, 就算是自己建立一个成员变量 __privates 也行啊, 非得用 预编译符的标识来声明私有成员
老帖子

引用来自“老帖子”的评论

再丑也没有 function* 丑。。。
我已经习惯了

引用来自“老帖子”的评论

其实不用private也有原因的,obj.a 你能在语法上得知 a 是私有的还是公有的?
用 # 就没问题,this.#a 和 this.a 是不同的成员,前者很明确是私有变量,后者是公有的。
js是动态语言。如果用 private,必然要求js引擎在每一次成员访问时检查成员是否是公有的。然而使用#a的话js引擎在语法解析时就可以得知这条语句肯定是非法的

引用来自“John0King”的评论

js 解释器,完全可以把所有 private 变量/方法 解释到一个 私有属性里面 比如 object.proptotype.____privates ,
而且 做为同为 C 系的语法, 跟 C/C++ C# 的 预编译符 冲突,再说 现在 在 Typescript 里面 已经存在了 这哥草案,纯粹是 体现他们的 存在感
大哥,
js的内存模型,成员变量是放到对象本身上的啊,成员函数才是放在prototype上的。。。
J
John0King

引用来自“老帖子”的评论

再丑也没有 function* 丑。。。
我已经习惯了

引用来自“老帖子”的评论

其实不用private也有原因的,obj.a 你能在语法上得知 a 是私有的还是公有的?
用 # 就没问题,this.#a 和 this.a 是不同的成员,前者很明确是私有变量,后者是公有的。
js是动态语言。如果用 private,必然要求js引擎在每一次成员访问时检查成员是否是公有的。然而使用#a的话js引擎在语法解析时就可以得知这条语句肯定是非法的
js 解释器,完全可以把所有 private 变量/方法 解释到一个 私有属性里面 比如 object.proptotype.____privates ,
而且 做为同为 C 系的语法, 跟 C/C++ C# 的 预编译符 冲突,再说 现在 在 Typescript 里面 已经存在了 这哥草案,纯粹是 体现他们的 存在感
老帖子

引用来自“老帖子”的评论

再丑也没有 function* 丑。。。
我已经习惯了
其实不用private也有原因的,obj.a 你能在语法上得知 a 是私有的还是公有的?
用 # 就没问题,this.#a 和 this.a 是不同的成员,前者很明确是私有变量,后者是公有的。
js是动态语言。如果用 private,必然要求js引擎在每一次成员访问时检查成员是否是公有的。然而使用#a的话js引擎在语法解析时就可以得知这条语句肯定是非法的
老帖子
再丑也没有 function* 丑。。。
我已经习惯了
h4cd
h4cd
说到这个,翻译频道刚好有一篇关于 JS 私有变量的文章:https://www.oschina.net/translate/private-variables-in-javascript
东方星痕
东方星痕
以后用wasm吧,别用js了
JinHengyu
JinHengyu
我要放弃信仰去学typescript了//
孤星闵月
孤星闵月
这简直就是逗逼的祖宗,
久永
久永

引用来自“小乔布斯”的评论

刻意为了和TypeScript不同而不同,真是傻X
说白了,就是一帮官老爷为了显示自己权利,
彰显存在感,故意制造变扭!
还说的铮铮有词的,真是“从未见过如此无耻之人”!
真TMD是白痴!“肉食者鄙!”
这帮官老爷除了资本意外,P农的话才不会理会呢,
我看能阻止这个的,只有码农们自己的实际行动了。
——坚决不用,或者我干脆直接用 TS 好了。
返回顶部
顶部