這次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);
官方也有給一些重點
- 有更好的封裝性
- private field只能在field declartion的地方declared,不能被延後創建,但是可以跟一般的property於任何時候給值
當然Community也提出了很大的疑慮
- 在很多語言底下,#代表註解,會不會造成混亂
- TypeScript偷偷做了private,現在寫法不一樣造成我們認知的負擔
而現在Babel 7.0+已經打算要實作了 https://github.com/babel/babel/pull/8654
這項改動看起來一定又會造成es生態的大衝擊,寫個js就像寫css一樣,連#都派上場了,不過大家既然都在這個列車上,所以只能坐穩了各位。
留言
張貼留言