TC39 在 GitHub 通過一條 EMCAScript 私有屬性的草案
近日,TC39 在 GitHub 上 ofollow,noindex">通過了 一條 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 的發展方向。
參考連結
那麼問題來了,對於這項新特性你是支援還是反對呢?歡迎在評論區留下你的看法。
參考: 前端之巔