Gibt es Proxy-Objekt Polyfill verfügbar Google Chrome?

8

Ist das überhaupt möglich? Wie wäre es mit anderen Browsern? Irgendwelche Schätzungen wenn es6 "bereit" und ausgerollt ist?

Ссылка

übrigens. Ссылка Proxy funktioniert nicht mit dem aktuellen Chrom (36.0.n)

    
pasuna 23.07.2014, 09:50
quelle

4 Antworten

5

Sie könnten Object.defineProperty und Object.observe um einen Proxy zu simulieren. Ich begann mich zu fragen, wie viel Funktionalität ein Polyfill unterstützen könnte, also schrieb ich eine Implementierung (Sie können es unter gist.github.com/mailmindlin sehen / 640e9d707ae3bd666d70 ). Ich konnte alle Funktionen von Proxy emulieren, die nicht auf das Überladen von Operatoren angewiesen waren, was in JavaScript ab sofort nicht möglich ist.

Sie können jedoch get , set und einige andere arbeiten. Sie können Getter und Setter verwenden, um die Eigenschaften des Zielobjekts zu spiegeln:

%Vor%

Das einzige Problem dabei ist, dass die Getter und Setter nur für Eigenschaften gelten, die für das Ziel definiert wurden, als der Proxy initialisiert wurde und der delete -Operator nicht funktioniert (wenn Sie eine Eigenschaft auf dem Ziel löschen Objekt wird der Proxy sie immer noch als Eigenschaft aufzählen, wenn Sie eine Eigenschaft auf dem Proxy löschen, wird dem Objekt nichts passieren.)

Um das zu beheben, können Sie Object.observe verwenden, das bei jeder Änderung eines der Objekte aufgerufen wird. Eine kurze Überprüfung von caniuse.com zeigt, dass Object.observe in Chrome und Opera verfügbar ist. Wenn Sie wirklich Unterstützung für Proxy in einem anderen Browser benötigen, können Sie die Objekte target und proxy abfragen, um zu überprüfen, ob Eigenschaften erstellt oder gelöscht wurden:

%Vor%

Wenn Sie dringend weitere Funktionen des Proxys benötigen, können Sie versuchen, Methoden wie Object.defineProperty und Object.getOwnPropertyDescriptor zu überschreiben, aber das könnte Kompatibilitätsprobleme mit anderen Skripten verursachen, je nachdem, wie Sie es tun.

Kurz gesagt, Sie können das meiste von dem tun, was Sie wahrscheinlich für einen Polyfill Proxy benötigen. Soweit Google es zu ihrem Browser hinzufügt, habe ich keine Ahnung. Es war anscheinend Teil der V8-Engine, wurde jedoch aufgrund von Sicherheitsproblemen (die niemand ausführte) entfernt, soweit ich dies anhand von dieser Thread .

    
mailmindlin 13.09.2015 18:32
quelle
1

Ich habe Babel-Plugin erstellt, das Ihnen erlaubt, dies zu tun, aber es kommt mit enormen Auswirkungen auf die Leistung (für jede Eigenschaft Zugriff) - es ist mehr Bildung Beispiel.

Ссылка

    
Krzysztof Kaczor 29.12.2015 22:24
quelle
1

Hier ist eines, das vom Google Chrome-Team erstellt wurde: Ссылка

Es ist jedoch keine vollständige Implementierung.

    
Steven Vachon 17.03.2016 04:21
quelle
1

Update: Obwohl meine Antwort eine teilweise Lösung bietet, beweist mailmindlins Lösung , dass mein Hauptpunkt falsch ist: Sie kann ein Polyfill für Proxy erstellen.

Nein, das kannst du nicht. Da Proxy s auf ein spezielles (neues) Verhalten mehrerer Syntaxelemente in der Sprache angewiesen ist - nämlich des Operators . und des Operators [ index ] - kann er nicht von einem Polyfill emuliert werden.

Die einzige Möglichkeit besteht darin, die von Ihnen verwendete Syntax zu ändern. Wenn Sie beispielsweise alle Zeichenfolgeneigenschaften über einen Proxy in Großbuchstaben schreiben möchten, können Sie ein "Proxy" -Objekt wie folgt erstellen:

%Vor%

Aber dann müsstest du es noch anders nennen:

%Vor%

statt

%Vor%

oder

%Vor%

was die neue Proxy-Syntax unterstützt.

Hinweis: Sie konnten fast ein Polyfill erstellen, das nur für Methoden funktionierte, indem Sie die Funktionseigenschaften des Objekts aufzählten und für jede dieser Eigenschaften eine Proxyfunktion für das Proxyobjekt erstellten. Dies würde jedoch nicht für Nichtfunktionseigenschaften funktionieren, da Sie die Art, auf die sie zugreifen, nicht dynamisch beeinflussen können.

    
jpaugh 18.06.2015 19:01
quelle