Benutzerdefinierter Array-artiger Getter in JavaScript

8

Ich habe eine einfache ES6-Klasse, so:

%Vor%

Ich möchte es so einrichten, dass die Indexierung für Ring-Objekte umbrochen wird, sodass new Ring(1, 2, 3)[3] 1 zurückgibt, new Ring(1, 2, 3)[-1] 3 zurückgibt und so weiter. Ist das in ES6 möglich? Wenn ja, wie würde ich es umsetzen?

Ich habe über Proxys gelesen, die einen vollständig angepassten Getter erlauben, aber ich kann nicht herausfinden, wie man einen Proxy auf eine Klasse anwendet. Ich habe das geschafft:

%Vor%

myRing ist jetzt ein Ring-Objekt, das das Umbrechen von Indizes unterstützt. Das Problem ist, dass ich jedesmal solche Ring-Objekte definieren müsste. Gibt es eine Möglichkeit, diesen Proxy auf die Klasse anzuwenden, so dass der Aufruf von new Ring() es zurückgibt?

    
ETHproductions 01.10.2016, 02:19
quelle

3 Antworten

5

Grundsätzlich ist es

%Vor%     
estus 01.10.2016, 03:19
quelle
3

Warnung: Dies ist ein hässlicher Hack

Dies ist ein ziemlich einfacher Ansatz, wenn Sie darüber nachdenken.

%Vor%

Dies hat eine Funktion ClassToProxy definiert. Das erste Argument ist die Klasse, der Sie auch Verhalten hinzufügen möchten, und die zweite ist der Handler.

Hier ist Beispiel Verwendung:

%Vor%     
Downgoat 01.10.2016 02:34
quelle
0

Sie haben grundsätzlich zwei Möglichkeiten:

  • Wickeln Sie eine Proxy um jede Instanz

    %Vor%
  • Umschließt einen Proxy um den Prototyp deiner Klasse

    %Vor%
Bergi 01.10.2016 10:20
quelle