Red Huang

Red Huang

ECMA TC39 將實作 JavaScript 私有的語言特性

這次 ECMA TC39 技術委員在 Github 上通過了 ECMAScript 語言特性的草案

詳情可以看這個 https://github.com/tc39/proposal-class-fields

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 一樣,連 #都派上場了,不過大家既然都在這個列車上,所以只能坐穩了各位。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。