JavaScript 私有屬性要來了,但實現方式惹爭議
作者|徐川
編輯|覃雲
昨天我們介紹了 ofollow,noindex" target="_blank">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(微信同號)