Ich komme sehr spät zu dieser Party, aber ich bin auf die OP-Frage in einer Suche gestoßen, also... Ja, Sie können private Eigenschaften haben, indem Sie die Klassendeklaration in einem Closure umhüllen
Es gibt ein Beispiel, wie ich private Methoden in diesem Codepen habe. Im folgenden Beispiel hat die Klasse Subscribable zwei 'private' Funktionen process
und processCallbacks
. Auf diese Weise können beliebige Eigenschaften hinzugefügt werden und sie bleiben privat durch die Verwendung des Closures. Meiner Meinung nach ist Privatsphäre selten erforderlich, wenn die Anliegen gut getrennt sind, und Javascript muss nicht durch Hinzufügen von mehr Syntax aufgebläht werden, wenn ein Closure die Arbeit ordentlich erledigt.
const Subscribable = (function(){
const process = (self, eventName, args) => {
self.processing.set(eventName, setTimeout(() => processCallbacks(self, eventName, args)))};
const processCallbacks = (self, eventName, args) => {
if (self.callingBack.get(eventName).length > 0){
const [nextCallback, ...callingBack] = self.callingBack.get(eventName);
self.callingBack.set(eventName, callingBack);
process(self, eventName, args);
nextCallback(...args)}
else {
delete self.processing.delete(eventName)}};
return class {
constructor(){
this.callingBack = new Map();
this.processing = new Map();
this.toCallbacks = new Map()}
subscribe(eventName, callback){
const callbacks = this.unsubscribe(eventName, callback);
this.toCallbacks.set(eventName, [...callbacks, callback]);
return () => this.unsubscribe(eventName, callback)} // callable to unsubscribe for convenience
unsubscribe(eventName, callback){
let callbacks = this.toCallbacks.get(eventName) || [];
callbacks = callbacks.filter(subscribedCallback => subscribedCallback !== callback);
if (callbacks.length > 0) {
this.toCallbacks.set(eventName, callbacks)}
else {
this.toCallbacks.delete(eventName)}
return callbacks}
emit(eventName, ...args){
this.callingBack.set(eventName, this.toCallbacks.get(eventName) || []);
if (!this.processing.has(eventName)){
process(this, eventName, args)}}}})();
Ich mag diesen Ansatz, weil er die Anliegen schön trennt und die Dinge wirklich privat hält. Der einzige Nachteil ist die Notwendigkeit, 'self' (oder etwas Ähnliches) zu verwenden, um auf 'this' im privaten Inhalt zu verweisen.