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:
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:
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 .
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.
Hier ist eines, das vom Google Chrome-Team erstellt wurde: Ссылка
Es ist jedoch keine vollständige Implementierung.
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.
Tags und Links javascript proxy google-chrome polyfills