Entfernen und erneutes Anfügen von Eigenschaften, die Funktionen zugeordnet sind, aus Javascript-Objekten

StackOverflow https://stackoverflow.com//questions/22064377

  •  23-12-2019
  •  | 
  •  

Frage

Ich habe eine bestehende clientseitige Anwendung, die Javascript-Objekte verwendet, die etwa so aussehen:

var myObject = {
   Id: 1,
   Name: 'Foo',
   Property1: 123,
   Property2: 'ABC',
   MyMethod: function() { ///do something },
   MyMethod2: function() { /// do something else }
};

Ich möchte nun versuchen, diese Objekte mithilfe eines Dienstes wie Firebase beizubehalten.Firebase gefällt die Eigenschaften, die die Funktionen enthalten, nicht, daher möchte ich wissen, ob es eine „einfache“ Möglichkeit gibt, die störenden Funktionen beim Speichern in Firebase zu entfernen und sie beim Abrufen wieder anzuhängen, ohne von jeder Kopie Kopien erstellen zu müssen Objekte.

War es hilfreich?

Lösung

Ein ziemlich häufiges Muster besteht darin, eine Konstruktorfunktion mit den relevanten Funktionen zu versehen und diesen Konstruktor eine Rohversion des Objekts akzeptieren zu lassen, das er verwendet, um sich selbst zu füllen, sowie eine „toRaw“-Funktion oder eine ähnliche Funktion, die Ihnen das gibt Rohkopie.

Zum Beispiel:

function Thingy(raw) {
    var name;
    for (name in raw) {
        if (raw.hasOwnProperty(name)) {
            this[name] = raw[name];
        }
    }
}
Thingy.prototype.MyMethod = function() { /* ... */ };
Thingy.prototype.MyMethod2 = function() { /* ... */ };
Thingy.prototype.toRaw = function() {
    var raw, name, value;
    for (name in this) {
        if (this.hasOwnProperty(name)) {
            value = this[name];
            if (typeof value !== "function") {
                if (value.toRaw) {
                    raw[name] = value.toRaw();
                } else {
                    raw[name] = this[name];
                }
            }
        }
    }
};

Dann beim Speichern in Firebase:

write(myObject.toRaw());

...und beim Lesen aus Firebase:

var obj = new Thingy(read());

Eine kompliziertere Handhabung würde darin bestehen, dem Rohobjekt ein Memo hinzuzufügen, das Ihnen mitteilt, ob eine der Eigenschaften des Objekts selbst dieses Muster verwendet, sodass Sie wissen, dass Sie den Konstruktor dafür aufrufen müssen, anstatt es nur zu kopieren.(Der Scharfsichtige wird bemerken, dass das obige Beispiel asymmetrisch ist, es lässt zu toRaw auf Eigenschaften beim Serialisieren in toRaw, aber nicht beim Deserialisieren Thingy.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top