自分がよく使っている方法メモ。
WeakMapを使った privateメンバ protectedメンバの実装の見た目を少しスッキリさせただけ。
(最初privateメンバ実装したつもりでしたが、コメントでご指摘いただいた通りprotectedだったので修正しました)
まず、以下のような関数をどこかに適当なファイル内で定義する。
この関数は、外部からアクセスできないWeakMapに値を出し入れすることで、
privateな変数を実現している。
const privates = new WeakMap();
module.exports = (self) => {
if (!privates.has(self)) {
privates.set(self, {});
}
return privates.get(self);
}
次に、privateなメソッドを定義したいクラスで上記関数を読み込んで使う。
const _ = require('./private.js');
class Person {
constructor(name) {
_(this).name = name;
}
print() {
console.log(_(this).name);
}
}
いえい
const person = new Person('test');
person.print(); // "test"
実はprotectedですらない
外部から_(person).nameとかやればアクセスできてしまうので厳密にはprotectedでは無いが、
明示的にアクセスしない限りはアクセス出来ないので、余程の事がない限り問題無いはず。