molily: OOP: Objekt von Außerhalb mit Funktion bestücken und ausführen

Beitrag lesen

Hallo,

JavaScript hat keine echten Klassen und daher auch keine echten privaten Member. »Private Variablen« funktionieren über Closures, d.h. im Konstruktor verschachtelte Funktionen. Die Sichtbarkeit/Kapselung funktioniert hier rein aufgrund des lexikalischen Scopes.

Wenn du von außen eine weitere Methode an das Objekt hängst, so hat diese Methode keinen Zugriff auf den Funktionsscope des Konstruktors, weil sie nicht darin verschachtelt ist. Was du vorhast wird sich also in dieser Weise nicht umsetzen lassen.

Ich möchte also bei der Initialisierung des Objekts bestimmen, was die onmyevent-Funktion genau macht.

Dann definiere sie von vornherein am Objekt und setze öffentliche Parameter zur Initialisierung.

Oder nutze pseudo-private Eigenschaften, die z.B. mit _ beginnen aber ansonsten normale Eigenschaften des Instanzobjektes sind.

Oder bau dir einen Mechanismus, wie du Methoden von außen hinzufügen kannst, welche dann die privaten Daten als Parameter übergeben bekommen. Zum Beispiel könntest du beim Aufruf des Konstruktors Funktionen übergeben. Allerdings werden diese keinen direkten Zugriff auf die privaten Daten haben, da sie lexikalisch nicht im Konstruktor notiert wurden.

Es gibt noch viele weitere Möglichkeiten. Wie flexibel musst die Lösung sein?

Letztlich bin ich nicht der Meinung, dass es sich hier konzeptionell um private Daten handelt. Schließlich fügst du von außen öffentliche Methoden hinzu. Dass diese nicht privilegiert sind, halte ich im OOP-Konzept für stimmig (jetzt abgesehen davon, dass es in JavaScript ohnehin nicht anders geht).

Das Konzept der Trennung von öffentlichen und privaten Daten soll dem Programmierer helfen, wohlstrukturierte Implementierungen durch separation of concerns und gute Interfaces zu schreiben. In den wenigsten Sprachen ist dies eine effektive Kapselung. Siehe:
Wozu Kapselung gut ist und wann sie nötig ist
http://forum.de.selfhtml.org/archiv/2011/2/t203423/#m1376643

Daher würde ich die Variablen einfach zu pseudo-privaten Eigenschaften machen. Du machst ohnehin kein streng klassenbasiertes OOP, sondern erzeugst Objekte durch prototypische Delegation und Komposition. Das ergibt in JavaScript völlig Sinn, beißt sich aber mit dem Konzept privater Member.

Mathias