この度、ECMA TC39 技術委員会は、ECMAScript 言語の特徴の草案を GitHub 上で承認しました。
詳細はこちらをご覧ください:https://github.com/tc39/proposal-class-fields
クラスのプライベートプロパティは、# を使用して表現されます。
現在#
クラスでプライベートプロパティを使用する場合、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);
公式ドキュメントでもいくつかの重要なポイントが挙げられています。
- より良いカプセル化が可能です。
- プライベートフィールドは、フィールド宣言の場所でのみ宣言され、遅延作成されることはありませんが、一般的なプロパティと同様にいつでも値を設定できます。
もちろん、コミュニティからはいくつかの懸念も出されています。
- 多くの言語では、# はコメントを表すため、混乱を引き起こす可能性があります。
- TypeScript は密かにプライベートを実装しましたが、現在の書き方は私たちの認識に負担をかけています。
そして、Babel 7.0+ ではすでに実装する予定です:https://github.com/babel/babel/pull/8654
この変更は、ES のエコシステムに大きな影響を与えることになるでしょう。JavaScript を書くことは CSS を書くことと同じくらい簡単になりますが、# も登場するようになりました。しかし、みなさんもこの列車に乗っている以上、しっかりと座っておくしかありません。