Ich denke, Bens Antwort ist wahrscheinlich die beste für die meisten Fälle, bis die Sprache nativ explizit private Variablen unterstützt.
Wenn Sie jedoch aus irgendeinem Grund den Zugriff mit Object.getOwnPropertySymbols()
verhindern müssen, ist eine Methode, die ich in Betracht gezogen habe, das Anhängen einer eindeutigen, nicht konfigurierbaren, nicht aufzählbaren, nicht beschreibbaren Eigenschaft, die als Eigenschaftskennung für jedes Objekt beim Erstellen verwendet werden kann (wie z.B. ein eindeutiges Symbol
, wenn Sie nicht bereits eine andere eindeutige Eigenschaft wie eine id
haben). Dann führen Sie einfach eine Zuordnung der "privaten" Variablen jedes Objekts unter Verwendung dieser Kennung durch.
const privateVars = {};
class Something {
constructor(){
Object.defineProperty(this, '_sym', {
configurable: false,
enumerable: false,
writable: false,
value: Symbol()
});
var myPrivateVars = {
privateProperty: "Ich bin versteckt"
};
privateVars[this._sym] = myPrivateVars;
this.property = "Ich bin öffentlich";
}
getPrivateProperty() {
return privateVars[this._sym].privateProperty;
}
// Eine Aufräummethode ist erforderlich, da die Variablen nicht automatisch aus dem Speicher gelöscht werden,
// wenn das Objekt vom Garbage Collector aufgeräumt wird
destroy() {
delete privateVars[this._sym];
}
}
var instance = new Something();
console.log(instance.property); //=> "I'm public"
console.log(instance.privateProperty); //=> undefined
console.log(instance.getPrivateProperty()); //=> "I'm hidden"
Der potenzielle Vorteil dieses Ansatzes gegenüber der Verwendung eines WeakMap
ist schnellere Zugriffszeit, wenn die Leistung ein Anliegen wird.