Ich möchte ein Objekt nehmen und einige Methoden daraus entfernen.
d. Ich habe intern ein Objekt mit Getter / Setter und ich möchte externen Benutzern Zugriff darauf geben. Ich möchte nicht, dass sie Zugriff auf die Setter-Funktionen haben.
Ich möchte die ursprüngliche Objektreferenz nicht ändern, indem ich Methoden daraus entferne, sondern eine neue Objektreferenz, die auf dasselbe Objekt verweist, aber weniger Methoden enthält.
Ich habe eine Implementierung dieser Funktion
%Vor% Siehe Live-Beispiel , _.each
_.bindAll
Für alle beabsichtigten Zwecke sollte das zurückgegebene Objekt dasselbe wie das ursprüngliche Objekt sein, außer dass einige der Methoden nicht mehr vorhanden sind. Die interne this
-Referenz darf keine der Funktionen unterbrechen. Die Prototypketten sollten nicht brechen.
Was Sie tun sollten, ist ein Fassadenmuster , das nur die Methoden enthält, die Sie behalten möchten und Delegation Pattern , um diese Methoden an eine Instanz des ursprünglichen Objekts zu delegieren. Mit der reichen Reflexion, die mit Javascript verfügbar ist, sollten Sie in der Lage sein, diese Fassaden relativ einfach zu generieren.
Mindestens ein Problem bei Ihrer Implementierung ist die Abhängigkeit von obj.constructor
. Die Eigenschaft constructor
ist notorisch nicht schreibgeschützt und kann leicht durcheinander gebracht werden. Betrachten Sie das folgende Muster, das eine ziemlich übliche Art ist, Klassen in Javascript zu definieren:
Ich denke, der Weg dahin ist, eine neue Klasse mit Ihrer obj
-Instanz als Prototyp zu erstellen. Sie können dann den Zugriff auf die alten Funktionen blockieren, indem Sie für ein Objekt der neuen Klasse leere Schlüssel hinzufügen:
(Dies basiert teilweise auf den Power Constructor-Funktionen von Crockford, hier diskutiert .)
BEARBEITEN: Ich habe den obigen Code aktualisiert, um Ihre Kommentare zu adressieren. Es ähnelt nun Ihrer Implementierung, ist aber einfacher und vermeidet das Problem constructor
. Wie Sie sehen, beziehen sich Verweise auf öffentliche Funktionen jetzt auf das alte Objekt.
Wenn instanceof
funktioniert, müssen wir die Vererbung verwenden, wie die @ nabinowitz-Lösung. In dieser Lösung werden unerwünschte Methoden mit Schlüsseln, die auf null gesetzt sind, verborgen, und diese Schlüssel sind für den Benutzer zugänglich, so dass sie möglicherweise vom Benutzer zurückgesetzt werden. Wir können dies verhindern, indem wir diese Schlüssel in einem Zwischenobjekt verbergen und aus einer Zwischenklasse instanziiert werden, damit die Vererbung nicht bricht.
Im folgenden Beispiel stellen i
und j
zwei Methoden zum Implementieren von Elementwerten dar. Einer ist das private Mitglied in der Schließung und der andere ist öffentliches Mitglied der Klasse.
Wie Sie sehen, sind alle Setter- und Sink-Methoden im eingeschränkten Objekt verborgen. Der Benutzer kann nur Getter verwenden oder den Wert von i
und j
erhöhen.
Wenn Sie nur bestimmte Methoden in Ihrem Objekt als public verfügbar machen und den Rest als privat betrachten möchten, können Sie so etwas tun (im folgenden Beispiel wird privateMethod2 nie in dem neuen Objekt "read only" angezeigt, das an das Objekt zurückgegeben wird Benutzer):
%Vor%Sie wählen einen sehr komplizierten Ansatz. Geben Sie zuerst weitere Details an:
Antwort auf Kommentar 1 :
Ein bisschen mehr über Closure-Compiler-Verschleierung funktioniert.
Die folgende Methode wird von Google verwendet (GMaps, GMail und usw.).
Ich dachte @ nrabinowitz getRestricted
( Link ) Funktion war so ziemlich die Antwort, nach der Sie gesucht haben.
Ich bin kein großer Fan von GOF-Pattern-Anwendungen in JavaScript (es gibt eine ganze Diskussion an sich). Aber das riecht für mich wie ein Dekorateur , da wir das Laufzeitverhalten bei bestimmten Objekten ändern - aber umgekehrt - ein De- Dekorateur wenn Sie mögen:)
Ich würde sagen, dass das Muster, das zu Ihrer Situation ziemlich genau passt, der Proxy ist.
UPDATE: Wie die Kommentare zeigen, sollte ein Proxy die gleiche Schnittstelle wie das reale Objekt unterstützen und daher nicht gut zu dem in der Frage angegebenen Problem passen. Am Ende des Wikipedia Artikels auf Proxy habe ich einen Link zu einem interessanten Artikel gefunden, der Proxy, Adapter und Facade vergleicht Muster.
Tags und Links javascript design-patterns object public-method