Ich habe in letzter Zeit ziemlich viel darüber nachgedacht, wie man OOP in JS macht, insbesondere wenn es um Kapselung und Vererbung geht.
Laut Crockford ist klassisch aufgrund von new () schädlich, und sowohl prototypisch als auch klassisch sind begrenzt, da die Verwendung von constructor.prototype bedeutet, dass Sie keine Verschlüsse für die Kapselung verwenden können.
Kürzlich habe ich die folgenden Punkte zur Kapselung berücksichtigt:
Die Kapselung beeinträchtigt die Leistung . Sie können Funktionen zu JEDEM Mitgliedsobjekt und nicht zum Prototyp hinzufügen, da die Methoden jedes Objekts unterschiedliche Abschlüsse haben (jedes Objekt hat unterschiedliche private Mitglieder).
Durch die Kapselung wird die hässliche Problemumgehung "var that = this" erzwungen, damit private Hilfsfunktionen Zugriff auf die Instanz erhalten, an die sie angehängt sind. Entweder das oder stellen Sie sicher, dass Sie sie jedes Mal mit privateFunction.apply (this) aufrufen.
Gibt es Problemumgehungen für eines der beiden von mir genannten Probleme? Wenn nicht, halten Sie die Kapselung dennoch für lohnenswert?
Nebenbemerkung: Mit dem von Crockford beschriebenen Funktionsmuster können Sie nicht einmal öffentliche Methoden hinzufügen, die nur öffentliche Mitglieder berühren, da auf die Verwendung von new () und constructor.prototype vollständig verzichtet wird. Wäre ein hybrider Ansatz, bei dem Sie klassische Vererbung und new () verwenden, aber auch Super.apply (dies, Argumente) aufrufen, um private Mitglieder und privilegierte Methoden zu initialisieren, nicht überlegen?
O(1)
zu O(n)
mit n = 2
...