2013-03-12 11 views
5

Ich habe ein Objekt wie folgt aus:Geben eines Javascript-Objekt zu Web Worker

function A(id) { 
    this.id = id; 
} 

A.prototype.getId = function() { 
    return this.id; 
} 

Es in einer html-Seite als Datei enthalten ist ("objects.js") sowie in der Web-Arbeiter mit importScript ("objects.js"). Jetzt erstelle ich eine Instanz von A in der HTML-Seite mit "var a = new A()" und poste sie mit "postMessage()" an einen Web Worker.

Die lustige Sache ist, dass in der Worker es immer noch die Eigenschaft "ID" mit seinem Wert hat, aber die Prototyp-Funktion ist verloren. Ich vermute, der Grund könnte sein, dass die Prototyp-Funktionen an den Kontext der HTML-Seite gebunden sind und nicht an den Web-Worker-Kontext.

Also, was ich in dem Arbeiter zu tun ist, dass:

event.data.a.__proto__ = A.prototype; 

Es funktioniert, und ich sehe es als eine Art Guss ...

Nun meine Frage ist, ob das ist die einzige und ein gültiger Weg oder wenn es eine bessere Möglichkeit gibt, ein Objekt mit Prototypfunktionen an einen Web-Arbeiter zu senden. Die Objektdefinition ist in beiden Kontexten verfügbar ...

Antwort

1

Die Spezifikation für Webworkers lässt nur die Übergabe von Strings zu.

Here ist eine Frage dazu.

Sie sollten also die Objektdaten mit (zum Beispiel) json serialisieren und dann auf der anderen Seite deserialisieren und so eine neue Instanz des Objekts mit den gleichen Daten im Webworker erstellen.

Die gleiche Methode kann verwendet werden, um das Objekt wieder zu übergeben - aber beide müssen wissen, wie Objekte des Typs A erstellt, serialisiert und deserialisiert werden.

+1

Ich bin mir ziemlich sicher, dass es auch möglich ist, ein Objekt zu übergeben, solange es nicht funktioniert. Zumindest funktioniert es für mich in allen gängigen Browsern ... – user2160787

+0

@ user2160787 Ja, aber nur, weil Javascript automatisch einfache Objekte (zB Arrays) serialisiert und deserialisiert. – fredrik

+0

ok danke, also ich schätze ich lehne nur die Prototypfunktionen ab :) – user2160787

1

Die structure clone algorithm, die zum Serialisieren von Daten verwendet wird, bevor sie an den Web-Worker gesendet wird, führt die Prototypkette nicht durch (für Details siehe § 2.7.5 Safe passing of structured data). Das erklärt, warum die abgeleiteten Funktionen nicht erhalten bleiben.

Neben der manuellen Wiederherstellung des Objekts können Sie auch ein neues Objekt mit den Prototypfunktionen erstellen und Object.assign verwenden, um die Eigenschaften aus dem empfangenen Objekt zu kopieren.

Beachten Sie, dass beide Problemumgehungen annehmen, dass das Prototyp-Objekt und ihre Funktionen dem Web Worker bekannt sind. Im Allgemeinen gibt es keinen automatisierten Weg, um beliebige Objekte zu übertragen, während Funktionen beibehalten werden (siehe meine answer zu this related question über das Senden von Objekten mit Funktionen).