Der einzige Weg, um echte Privatsphäre in JS zu erreichen, ist durch Scoping, sodass es keine Möglichkeit gibt, eine Eigenschaft, die ein Mitglied von this
ist, die nur innerhalb des Components zugänglich ist. Der beste Weg, um wirklich private Daten in ES6 zu speichern, ist mit einem WeakMap.
const privateProp1 = new WeakMap();
const privateProp2 = new WeakMap();
class SomeClass {
constructor() {
privateProp1.set(this, "Ich bin privat1");
privateProp2.set(this, "Ich bin privat2");
this.publicVar = "Ich bin öffentlich";
this.publicMethod = () => {
console.log(privateProp1.get(this), privateProp2.get(this))
};
}
printPrivate() {
console.log(privateProp1.get(this));
}
}
Offensichtlich ist dies wahrscheinlich langsam und definitiv hässlich, aber es bietet Privatsphäre.
Denken Sie daran, dass AUCH DAS nicht perfekt ist, weil Javascript so dynamisch ist. Jemand könnte immer noch
var oldSet = WeakMap.prototype.set;
WeakMap.prototype.set = function(key, value){
// Speichere 'this', 'key' und 'value'
return oldSet.call(this, key, value);
};
um Werte abzufangen, während sie gespeichert werden, also wenn Sie besonders vorsichtig sein möchten, müssten Sie eine lokale Referenz auf .set
und .get
erfassen, um explizit anstatt auf dem überdeckbaren Prototypen zu vertrauen.
const {set: WMSet, get: WMGet} = WeakMap.prototype;
const privateProp1 = new WeakMap();
const privateProp2 = new WeakMap();
class SomeClass {
constructor() {
WMSet.call(privateProp1, this, "Ich bin privat1");
WMSet.call(privateProp2, this, "Ich bin privat2");
this.publicVar = "Ich bin öffentlich";
this.publicMethod = () => {
console.log(WMGet.call(privateProp1, this), WMGet.call(privateProp2, this))
};
}
printPrivate() {
console.log(WMGet.call(privateProp1, this));
}
}