跳到主要內容

ECMA TC39 將實作 javascript private的語言特性

這次ECMA TC39 技術委員在Github上通過了ECMAScript語言特性的草案
class的private property將可以用 # 來表示

現在

如果class要使用private property的話,必須利用Symbol或是WeakMap特性或是其他方法來實作
var _action = Symbol('action'); class Person { getXXX() { return this[_action](); } [_action]() { return 'hi'; } }

未來

而現在更新之後,直接偷範例過來用
class Counter extends HTMLElement { #xValue = 0; get #x() { return #xValue; } set #x(value) { this.#xValue = value; window.requestAnimationFrame(this.#render.bind(this)); } #clicked() { this.#x++; } constructor() { super(); this.onclick = this.#clicked.bind(this); } connectedCallback() { this.#render(); } #render() { this.textContent = this.#x.toString(); } } window.customElements.define('num-counter', Counter);
官方也有給一些重點
  1. 有更好的封裝性
  2. private field只能在field declartion的地方declared,不能被延後創建,但是可以跟一般的property於任何時候給值
當然Community也提出了很大的疑慮
  1. 在很多語言底下,#代表註解,會不會造成混亂
  2. TypeScript偷偷做了private,現在寫法不一樣造成我們認知的負擔
而現在Babel 7.0+已經打算要實作了 https://github.com/babel/babel/pull/8654
這項改動看起來一定又會造成es生態的大衝擊,寫個js就像寫css一樣,連#都派上場了,不過大家既然都在這個列車上,所以只能坐穩了各位。

留言