Hallo! Das ist meine erste Frage!
Ich experimentiere mit dem Modulmuster von Doug Crockford und anderen. Meistens sehr zufrieden damit, aber ich bin ein wenig unsicher, wie man am besten mit einem bestimmten Vererbungsmuster umgehen kann.
Ich habe es zu einem nackten Knochen Fall mit Katze und Säugetier eingekocht, obwohl meine eigentliche Absicht ist, Objekte für ein Spiel auf Kachelbasis in Leinwand zu machen.
Aber hier ist meine nackte Knochen "Tiere" Fall mit einem Browser-Alarm:
%Vor% Was mich an diesem Ansatz stört, ist, dass ich voice
zu einer öffentlichen Eigenschaft machen musste, damit die Katze sie modifizieren kann.
Was ich wirklich möchte, ist etwas wie 'geschützte' Sichtbarkeit (aus Java, ActionScript usw.), so dass cat
voice
ändern kann, ohne dass jemand mit dem Zugriff auf felix
es modifizieren kann.
Gibt es eine Lösung?
Sie können geschützte Sichtbarkeit (für Sie selbst und untergeordnete Objekte sichtbar) simulieren, indem Sie ein leeres Objekt an Ihre Basis- "Klasse" übergeben, die als Repository für Ihre geschützten Eigenschaften dient. Dadurch können Sie Eigenschaften über Ihre Vererbungskette freigeben, ohne sie öffentlich zu machen.
%Vor%Hier ist eine Live-Demo
Nicht-antwortende Antwort:
Es gibt einige Möglichkeiten, geschützte Eigenschaften in Javascript zu erhalten, aber sie sind nicht unbedingt sehr idiomatisch. Wenn ich du wäre, würde ich zuerst entweder
in Betracht ziehen Verwendung der Konvention für öffentliche Eigenschaften, die mit einem Unterstrich (zB: _voice
) versehen sind, um den Datenschutz zu kennzeichnen. Es ist sehr einfach und ist so etwas wie ein Standard unter dynamischen Sprachen.
Suchen Sie eine alternative Lösung ohne Vererbung. Vererbung verkompliziert und verbindet die Dinge oft zu sehr, daher das alte Mantra "Komposition über Vererbung bevorzugen". Javascript hat viele Funktionen wie Duck Typing und Funktionen höherer Ordnung, die es oft vermeiden, Vererbung in Situationen zu verwenden, in denen Sie es normalerweise in Java benötigen würden
Es gibt eine Problemumgehung, um geschützte Mitglieder zu simulieren, wo Sie diese Mitglieder für eine Weile veröffentlichen und dann wieder privatisieren. Ich bin kein großer Fan davon, aber es ist eine "Lösung".
Ich zitiere nur von diesem SitePoint Artikel :
Geschützte Mitglieder hinzufügen
Die Aufteilung eines Skripts in mehrere Module ist üblich und praktisch trainieren. Es macht eine große Codebasis viel einfacher zu verwalten und ermöglicht um Bandbreiteneinsparungen zu erzielen, wenn Module nicht immer benötigt werden.
Aber was, wenn wir Daten zwischen verschiedenen Modulen austauschen möchten? Wenn wir Machen Sie diese Daten öffentlich, dann verlieren wir die Vorteile der Privatsphäre, aber wenn Wir machen es privat, es wird nur für ein Modul verfügbar sein. Was wir wirklich brauchen sind geteilte private Mitglieder, und diese sind bekannt als geschützt.
JavaScript hat keine geschützten Mitglieder als solche, aber wir können schaffen sie effektiv, indem sie Daten vorübergehend öffentlich machen. Erreichen Lassen Sie mich zunächst zwei Schlüsselfunktionen vorstellen - erweitern und privatisieren - was wir als Teil eines Utility-Functions-Objekts definieren werden:
%Vor%Die Erweiterungsfunktion fügt einfach einem Objekt neue Eigenschaften hinzu, während der privatize-Funktion kopiert eine Eigenschaft und löscht dann das Original. Wir Sie können Extend in einem Modul verwenden, um eine öffentliche Referenz zu einem privaten Objekt zu erstellen Variable, und dann in einem anderen Modul privatisieren, um es zurück zu kopieren eine private Variable und löschen Sie die öffentliche Referenz.
Hier ist ein Beispiel für das erste Modul, das zwei geschützte hat Mitglieder (einschließlich des utils-Objekts selbst) und ein öffentliches Mitglied. Zu behalte das Codebeispiel kurz, die Utility-Funktionen sind einfach leer Muscheln, aber sie wären identisch mit den Funktionen, die ich dir gezeigt habe Moment her:
%Vor%Sie können sehen, wie wir eine Variante des aufschlussreichen Modulmusters verwenden, nicht nur die öffentlichen Mitglieder, sondern die geschützten Mitglieder als Gut. An diesem Punkt haben wir drei öffentliche Mitglieder: MyModule.myProtectedData, MyModule.utils und MyModule.myPublicData.
Hier ist ein Beispiel für das letzte Modul, das die Privatisierung verwendet Funktion, um die angegebenen öffentlichen Mitglieder zurück in private zu kopieren Variablen und löschen Sie dann ihre öffentlichen Referenzen:
%Vor%Und sobald das erledigt ist, sind die geschützten Mitglieder in ihren eingeschlossen Objekte, die für beide Module privat verfügbar sind, aber nicht mehr von außerhalb von ihnen verfügbar.
Beachten Sie, dass die Privatisierungsfunktion separate Argumente benötigt für das Objekt und den Property-Key, weil Objekte in JavaScript sind per Referenz weitergegeben. Also Wurzel ist eine Referenz zu MyModule, und wenn wir lösche eine Eigenschaft, die mit key angegeben wurde, löschen wir diese Eigenschaft aus dem referenzierten Objekt.
Aber wenn es so war:
%Vor%Und so genannt:
%Vor%Dann würden die öffentlichen Mitglieder nicht gelöscht - die Funktion würde Löschen Sie einfach die Referenz, nicht die Eigenschaft, auf die sie sich bezieht.
Das try ... catch-Konstrukt ist auch für ältere IE-Versionen notwendig, in denen das Löschen nicht unterstützt wird. In diesem Fall machen wir die Öffentlichkeit zunichte Eigenschaft, anstatt es zu löschen, das ist natürlich nicht das Gleiche, aber hat ein äquivalentes Endergebnis der Negierung der Mitglieder der Öffentlichkeit Referenz.
Tags und Links javascript inheritance