JavaScript Modul Pattern - Geschützte Mitglieder?

8

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?

    
brennanyoung 02.01.2012, 17:44
quelle

3 Antworten

14

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

    
Adam Rackis 02.01.2012, 17:52
quelle
1

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
  1. 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.

  2. 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

hugomg 02.01.2012 18:00
quelle
1

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.

    
nikoskip 08.04.2015 15:14
quelle

Tags und Links