Möglicher Zugriff auf private Konstruktor-Variablen aus einem Funktionsprototyp?

8

Basierend auf meinem Verständnis von JavaScript können Prototypmethoden nicht auf Variablen zugreifen, die für den Bereich des Konstruktors privat sind,

%Vor%

Es macht durchaus Sinn, aber gibt es einen Weg, der sicher und gut ist? Da die Verwendung von Prototypen insofern einen Leistungsvorteil bietet, als dass die Elementfunktionen nur einmal zugewiesen werden, möchte ich eine ähnliche Funktionalität erreichen und trotzdem in der Lage sein, zu meinen privaten Variablen zu gelangen. Ich glaube nicht, dass es funktioniert, wenn man einen Prototyp benutzt, aber gibt es ein anderes Muster, wie eine Fabrikmethode oder einen Schließungsansatz? Etwas wie,

%Vor%

Ich bin mir nicht sicher, ob eine neue Kopie von _alertPrivate jedes Mal erstellt wird, wenn ich ein neues Foo erstelle oder wenn es einen potenziellen Leistungsvorteil gibt. Die Absicht ist, eine Funktionalität ähnlich dem Prototyping zu erhalten (insofern es Speicher spart), während immer noch auf private Variablen zugegriffen werden kann.

Danke.

    
Sean Thoman 16.10.2011, 23:52
quelle

3 Antworten

4

Ich habe das folgende Muster entwickelt, um dieses Problem anzugehen, zumindest jetzt. Was ich brauchte, war ein privilegierter Setter, so dass eine private Variable von innerhalb bestimmter Prototypfunktionen geändert werden konnte, aber nicht von irgendwo anders:

%Vor%

Grundsätzlich wird ein Zeiger auf den internen Zustand des Objekts über eine einfache Accessor-Funktion auf seinen Prototyp geholt () {return state; }. Wenn Sie die Funktion 'caller' für eine bestimmte Instanz verwenden, können Sie Funktionen aufrufen, die nur einmal erstellt werden, aber immer noch auf den privaten Zustand in dieser Instanz verweisen können. Es ist auch wichtig zu beachten, dass keine Funktionen außerhalb des Prototyps jemals auf den privilegierten Zugriffsmechanismus zugreifen können, da der "Aufrufer" nur einen Schlüssel akzeptiert, der auf die vordefinierten Funktionen verweist, die sich im Gültigkeitsbereich befinden.

Hier sind einige Benchmarks dieser Methode, um zu sehen, wie es mit reinem Prototyping verglichen wird. Diese Zahlen stellen die Erstellung von 80.000 Instanzen des Objekts in einer Schleife dar (beachten Sie, dass das für das Benchmarking verwendete Objekt komplexer ist als das obige, was lediglich der Vereinfachung diente):

CHROME:

Nur Schließung - 2172ms

Prototyping (oben beschrieben) - 822ms

Prototyping (Std-Weg) - 751ms

FIREFOX:

Nur Schließung - 1528ms

Prototyping (oben beschrieben) - 971ms

Prototyping (Std-Weg) - 752ms

Wie Sie sehen können, ist die Methode fast so schnell wie normales Prototyping und definitiv schneller als nur eine normale Schließung zu verwenden, die Funktionen zusammen mit der Instanz kopiert.

    
Sean Thoman 18.10.2011, 17:06
quelle
1

Ich fand Sean Thomans Antwort sehr hilfreich (obwohl sie zunächst schwer zu verstehen ist).

Es sah nicht so aus, als könnte der öffentliche Setter einen Wert für privateVar akzeptieren, also habe ich ein paar Änderungen vorgenommen:

Ändern Sie update in functions :

%Vor%

Ändere Update in proto :

%Vor%

Ändern hoist :

%Vor%     
Kelvin 09.05.2013 16:21
quelle
1

Was Sie verlangen, ist möglich, obwohl es immer einen Kompromiss zwischen Leistung (in Geschwindigkeit oder Speicher) und Funktionalität geben wird.

In JavaScript ist es möglich, mit normalen Prototypmethoden (und ohne zentralisierten, undichten Feldspeicher) einen Zustand pro Instanz zu erreichen.

Überprüfen Sie den Artikel, den ich über die Technik schrieb: Ссылка

Oder gehen Sie direkt zum Quellcode in Ссылка .

    
Duarte Cunha Leão 18.07.2014 00:16
quelle